【问题标题】:Rails: How to make cancan work on each object?Rails:如何使 cancan 在每个对象上工作?
【发布时间】:2016-12-22 03:56:46
【问题描述】:

用户.rb

def has_delete_role? name
  roles.each do |n|
    return true if n == name
  end
end

能力.rb

if user.has_delete_role? :business_delete
  can :destroy, Business
end

index.html.erb

<% if can? :destroy, @business %>
  <%= link_to 'delete', business_path(@business.id), method: :delete%>
<% end %>

这段代码允许有权访问删除按钮的用户。这里如果用户有权限,他可以访问所有对象的删除按钮。

EX:业务有10个对象id = 1到id = 10,如果他有权限,用户可以访问所有10个删除按钮
但现在我想根据对象设置权限。

EX:业务也是1到10,用户只能看到按钮2和5,因为用户数据表中有一个名为auth_ids []的字段,它存储[2,5]

如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails cancan


    【解决方案1】:

    你可以使用:

    can :destroy, Business, id: user.auth_ids
    

    【讨论】:

    • 我按照您的解决方案进行操作,但出现这样的错误 可以吗?不能吗?调用不能与原始 sql 'can' 定义一起使用。
    • 你好,这次没有报错,但是导致cancan不能正常工作,比如auth_ids是[1,2],但是我可以访问所有1到10
    • gem 'cancancan', '~> 1.15'
    • 嘿...对不起...我发现我确实管理了所有内部能力...您编辑的解决方案完全适合我。很抱歉浪费了您的时间。
    【解决方案2】:

    您可以设置条件,类似于此处的指南:https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities

    can :destroy, Business, Business.where('id = ?', user.auth_ids)
    

    【讨论】:

    • 我遵循了您的解决方案,但收到了这样的错误The can? and cannot? call cannot be used with a raw sql 'can' definition.
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多