我有一个用于has_many关联的多选框。参数显示为:
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
这种方法将迫使我找到所有的foo,循环遍历它们,并分别对每个foo进行授权。有没有一种更简单的方法来管理has_many授权,最好是使用Pundit gem?
实现这一点的最简单方法是循环。遍历用户数组中的每个用户,并对每个用户进行授权。例如,
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
这是最基本、最简单的答案。
我做了类似的事情。由于你提供的信息太少,我将做一系列假设。
-
您有一个foo到用户的多对多关联。我的意思是,一个foo可以有很多用户,一个用户可以是很多foo的成员。
-
您了解如何设置模型以达到(1)。如果你不只是评论,我会编辑这个回复。
因此,我们需要进行以下工作:
@foo.users
返回用户集合@user.foos
返回foo的集合
有了支持上述操作的模型,这比你想象的要容易得多。
class FooPolicy < ApplicationPolicy
class Scope < Scope
def resolve
user.foos
end
end
end
我认为你错过了专家的观点。Pundit允许您在逐个用户的基础上进行授权。因此,上面的代码将用户的范围限定为他们所属的组(在本例中为foo)。