2013-08-20 29 views
8

Tôi có một hộp chọn nhiều cho một liên kết has_many. Các tham số được đưa ra là:Cấp phép một mảng ID với đá quý Pundit

foo_ids: ["1", "2", "3"] 

Sử dụng thông số mạnh, tôi không cho phép thuộc tính này vì vậy mọi người không thể đặt bất kỳ thứ gì mình muốn vào đó.

def update 
    bar.foos = authorized_foos 
    bar.update(baz_params) 
    respond_with bar 
end 

private 

    def authorized_foos 
    foos = Foo.find(params[:baz][:foo_ids]) 
    foos.each do |foo| 
     authorize foo, :manage? 
    end 
    end 

Cách tiếp cận này sẽ buộc tôi phải tìm tất cả các sở thích, lặp lại chúng và ủy quyền từng cá nhân. Có cách nào dễ dàng hơn để quản lý ủy quyền has_many, tốt nhất là với đá quý Pundit?

+2

Xin chào Logan, tôi là một trong những người bảo trì của Pundit và muốn tìm hiểu về trường hợp sử dụng của bạn. Nó chỉ đơn giản là cho phép tất cả các hồ sơ trong bộ sưu tập, hoặc là kiểm tra bổ sung có liên quan nào đó? Thông tin đầu vào của bạn có thể giúp câu hỏi của bạn được giải quyết một cách độc đáo trong bản phát hành trong tương lai và cũng giúp người khác. Tôi rất vui nếu bạn có thể để lại một bình luận [ở đây] (https://github.com/elabs/pundit/issues/60). Cảm ơn trước! –

+3

Để lưu tất cả mọi người đọc qua toàn bộ chuỗi vấn đề trên Github. Vấn đề này đã đóng, về cơ bản nói rằng nó có thể được xử lý bằng cách mở rộng Pundit hoặc thay đổi cách bạn đi về điều này. –

Trả lời

1

Cách đơn giản nhất để thực hiện việc này là lặp. Lặp lại qua từng người dùng từ mảng của người dùng và ủy quyền cho mỗi người dùng. Ví dụ:

users_id_array = [1,2,3,4,5,6] 

private 

    def authorized_users 
    users = User.find(params[:group][:user_ids]) 
    users.each { |u| authorize u, :manage? } 
    ... 
end 

Vì vậy, đây là câu trả lời rất cơ bản và đơn giản nhất.

0

Tôi làm điều gì đó tương tự như thế này. Vì ít thông tin bạn cung cấp, tôi sẽ tạo ra một loạt các giả định.

  1. Bạn có nhiều liên kết đến nhiều người dùng. Bởi điều này tôi có nghĩa là một foo có thể có nhiều người dùng và một người dùng có thể là một thành viên của nhiều foos.

  2. Bạn hiểu cách thiết lập mô hình để đạt được (1). Nếu bạn không chỉ bình luận và tôi sẽ chỉnh sửa phản hồi này.

Vì vậy, những gì chúng ta sẽ cần phải có làm việc cho điều này để làm việc là như sau:

  1. @foo.users trả về một bộ sưu tập của người dùng
  2. @user.foos lợi nhuận một bộ sưu tập của foos

Với các mô hình được thiết lập để hỗ trợ các hành động trên, điều này dễ dàng hơn nhiều so với việc bạn thực hiện nó.

class FooPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     user.foos 
    end 
    end 
end 

Tôi nghĩ bạn đang thiếu điểm chuyên gia. Pundit cho phép bạn thực hiện ủy quyền trên cơ sở người dùng theo người dùng. Vì vậy, đoạn mã trên chỉ thu hút người dùng vào các nhóm (trong trường hợp này) mà họ là một phần của.