首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Pundit gem授权ID数组

使用Pundit gem授权ID数组
EN

Stack Overflow用户
提问于 2013-08-20 23:14:11
回答 2查看 1.8K关注 0票数 8

我有一个用于has_many关联的多选框。参数的形式为:

代码语言:javascript
复制
foo_ids: ["1", "2", "3"]

使用强参数,我不允许这个属性,因为我想自己授权它,这样人们就不能在里面放任何他们想要的东西。

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

发布于 2015-01-28 01:29:13

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-05-13 01:16:24

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

  1. 您可以将foo与用户建立多对多的关联。我的意思是,一个foo可以有多个用户,一个用户可以是多个foo的成员。
  2. 你知道如何建立模型来达到(1)。如果你不只是评论,我会编辑这条回复。

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

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

的集合

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

代码语言:javascript
复制
class FooPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      user.foos
    end
  end
end

我觉得你忽略了专家的意思。Pundit允许您逐个用户地进行授权。因此,上面的代码将用户的范围限定为他们所属的组(在本例中为foos)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18338731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档