使用Pundit gem授权一组ID

时间:2013-08-20 15:14:11

标签: ruby-on-rails ruby-on-rails-4 strong-parameters pundit

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

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

  1. 您与用户之间存在多对多的foos关联。我的意思是foo可以有很多用户,用户也可以成为很多人的成员。

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

  3. 因此,我们需要为此工作才能实现以下目标:

    1. @foo.users返回用户集合
    2. @user.foos会返回一组foos
    3. 设置模型以支持上述操作,这比你想要的更容易。

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

      我认为你错过了专家的观点。 Pundit允许您逐个用户进行授权。因此,上面的代码将用户范围仅限于他们所属的组(在这种情况下为foos)。