【问题标题】:What is the appropriate way to check an ability with conditions for CanCan in Rails?在 Rails 中检查具有 CanCan 条件的能力的适当方法是什么?
【发布时间】:2012-11-22 18:53:35
【问题描述】:

在我的应用程序中,我有几个用户角色;客户、销售人员、管理员和超级管理员。在我的技能课中,我根据这些角色定义了各种技能。

我目前为销售人员定义的唯一角色如下:

# Salesperson Abilities
if user.role == 'salesperson'
  can :create, User, :role => 'customer'
end

不幸的是,以下检查总是返回 true,允许销售人员创建任何用户,而不管角色如何:

can? :create, User, :role => @user.role

我已经运行了许多测试,验证了当前用户的角色和正在创建的角色,无论我在:role 条件中放置什么角色,能力检查总是返回真。如果我完全删除该能力,或者如果我使用 cannot 定义,则检查返回 false,因此我知道正在应用条件中的能力。

我没有正确定义或检查能力条件吗?谢谢。


更新

我注意到,如果我尝试使用 authorize! :create, @user 授权该功能,则会应用条件。如果我在控制器类的顶部定义load_and_authorize_resource,它们也会被应用。似乎只有当我尝试将can? 方法与控制器内部的条件一起使用时,这些才会失败。

【问题讨论】:

    标签: ruby-on-rails cancan


    【解决方案1】:

    documentation我发现了以下内容:

    重要提示:检查类的权限时,不会使用条件哈希或块。

    在这种情况下,解决方案是不检查类的权限,而是检查实例的权限,例如can? :create, @usercan? :create, User.new

    【讨论】:

      【解决方案2】:

      这个逻辑不属于能力内部。该能力应该定义如何修改对象的规则,而不是可以在这些对象内部修改哪些数据。此逻辑属于您的 User 模型,因为它处理模型的实际数据及其保存方式。这有意义吗?

      【讨论】:

      • 我理解您的建议,但在 documentation for CanCan 中,在“条件哈希”标题下,它演示了定义对象中必须存在的条件才能返回的做法是的。
      • 没错,您刚刚说了为什么您的方法行不通。当您发布创建时,该对象还不存在,那么您如何检查它的条件?这就是为什么这属于用户模型,而不是能力。您唯一的选择是将参数哈希传递给您的能力。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多