8

我有一个 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,遍历它们,并单独授权每个。有没有更简单的方法来管理 has_many 授权,最好是使用 Pundit gem?

4

2 回答 2

2

最简单的方法是循环。从用户数组中遍历每个用户并授权每个用户。例如,

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

所以这是非常基本和最简单的答案。

于 2015-01-27T17:29:12.580 回答
1

我做类似的事情。由于您提供的信息很少,我将做出一系列假设。

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

  2. 您了解如何设置模型以实现 (1)。如果您不只是发表评论,我将编辑此回复。

因此,我们需要为此工作如下:

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

通过设置模型来支持上述操作,这比您想象的要容易得多。

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

我认为你错过了权威人士的观点。Pundit 允许您逐个用户进行授权。因此,上面的代码将用户范围仅限于他们所属的组(在本例中为 foos)。

于 2017-05-12T17:16:23.943 回答