使用权威人士的宝石授权一组 ID



我有一个用于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

这是最基本、最简单的答案。

我做了类似的事情。由于你提供的信息太少,我将做一系列假设。

  1. 您有一个foo到用户的多对多关联。我的意思是,一个foo可以有很多用户,一个用户可以是很多foo的成员。

  2. 您了解如何设置模型以达到(1)。如果你不只是评论,我会编辑这个回复。

因此,我们需要进行以下工作:

  1. @foo.users返回用户集合
  2. @user.foos返回foo的集合

有了支持上述操作的模型,这比你想象的要容易得多。

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

我认为你错过了专家的观点。Pundit允许您在逐个用户的基础上进行授权。因此,上面的代码将用户的范围限定为他们所属的组(在本例中为foo)。

相关内容

  • 没有找到相关文章

最新更新