如何使用cancan来授权一系列资源?

bra*_*rad 6 authorization ruby-on-rails cancan

我有一个非宁静的控制器,我正在尝试使用cancan授权!应用权限的方法.

我有一个像这样开始的delete_multiple动作

def delete_multiple
    @invoices = apparent_user.invoices.find(params[:invoice_ids])
Run Code Online (Sandbox Code Playgroud)

我想在继续操作之前检查用户是否有权删除所有这些发票.如果我使用

authorize! :delete_multiple, @invoices
Run Code Online (Sandbox Code Playgroud)

许可被拒绝.我的能力.rb包括以下内容

if user.admin?
  can :manage, :all
elsif user.approved_user?
  can [:read, :update, :destroy, :delete_multiple], Invoice, :user_id => user.id
end
Run Code Online (Sandbox Code Playgroud)

是循环遍历我的数组并单独调用授权还是有更聪明的做事方式?我开始觉得做授权会比使用cancan用于复杂的非静态控制器更容易手动(尽管我的应用程序中有很多其他安静的控制器,它工作得很好).

Ger*_*rry 13

在这里稍晚,但你可以在你的能力课上写这个

can :delete_multiple, Array do |arr|
  arr.inject(true){|r, el| r && can?(:delete, el)}
end
Run Code Online (Sandbox Code Playgroud)

编辑

这可以写成:

can :delete_multiple, Array do |arr|
  arr.all? { |el| can?(:delete, el) }
end
Run Code Online (Sandbox Code Playgroud)

  • 没关系,解决了我自己的问题.上面定义的能力检查Array类,但`@ claims`在技术上是一个ActiveRecord :: Relation类.将其更改为"@ claims.all"可使其按预期运行. (2认同)
  • 感谢更新!提升一个22个月大的答案并接收即时编辑给了我一个好消息.如果可以,我会再次+1. (2认同)