在Rails中检查CanCan条件的能力的适当方法是什么?

时间:2011-10-12 00:11:57

标签: ruby-on-rails cancan

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

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

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

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

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

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

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


更新

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

2 个答案:

答案 0 :(得分:1)

documentation我发现了以下内容:

  

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

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

答案 1 :(得分:0)

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