【问题标题】:Authorizing an array of ID's with the Pundit gem使用 Pundit gem 授权一组 ID
【发布时间】:2013-08-20 15:14:11
【问题描述】:

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

【问题讨论】:

  • 您好 Logan,我是 Pundit 的维护者之一,想了解您的用例。它是简单地授权集合中的所有记录,还是以某种方式涉及额外的检查?您的输入可以在未来的版本中很好地解决您的问题,也可以帮助其他人。如果您能发表评论here,我会很高兴。提前致谢!
  • 为了让大家免于阅读 Github 上的整个问题线程。那里的这个问题已经结束,基本上可以通过扩展 Pundit 或改变你处理这个问题的方式来处理它。

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


【解决方案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

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

【讨论】:

    【解决方案2】:

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

    1. 您有 foos 与用户的多对多关联。我的意思是一个 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 允许您逐个用户进行授权。因此,上面的代码将用户范围仅限于他们所属的组(在本例中为 foos)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      相关资源
      最近更新 更多