2013-08-20 60 views
8

我有一個has_many關聯的多選框。 】這個params進來爲:授權一批身份證與權威寶石

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

使用強大的參數,我不允許這種屬性,因爲我想批准它自己,所以人不能只是把任何他們想要它。

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 

這種方法將迫使我找到所有的foos,通過它們循環,並單獨授權每一個。有沒有更簡單的方法來管理has_many授權,最好是與權威寶石?

+2

您好Logan,我是Pundit的維護人員之一,並希望瞭解您的使用案例。它只是簡單授權集合中的所有記錄,還是以某種方式涉及額外的檢查?您的輸入可以讓您的問題在未來的版本中得到很好的解決,並且可以幫助其他人。如果您可以發表評論[這裏](https://github.com/elabs/pundit/issues/60),我會很高興。提前致謝! –

+3

保存所有人閱讀Github上的整個問題線程。這個問題是封閉的,基本上說可以通過擴展權威人士或改變你對此的看法來處理。 –

回答

1

最簡單的方法就是循環。遍歷用戶數組中的每個用戶並授權每個用戶。 例如,

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 

所以這是非常基本的,最簡單的答案。

0

我做了類似的事情。由於你所提供的信息很少,我會做一些假設。

  1. 你有一個多對多的foos協會的用戶。通過這個,我的意思是foo可以有很多用戶,用戶可以是許多foos的成員。

  2. 您瞭解如何設置模型以實現(1)。如果你不只是評論,我會編輯這個回覆。

所以我們需要有這種工作的工作如下:

  1. @foo.users返回用戶的集合
  2. @user.foos回報FOOS集合

通過設置支持上述操作的模型,比您想要的要容易得多。

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

我想你錯過了評論家的觀點。權威人士允許您按用戶對用戶進行授權。因此,上面的代碼將用戶範圍僅限於他們所屬的組(本例中爲foos)。