3

这是我能力课上的一段代码

if user.admin?
      can :manage, :all
      can :destroy, :all if != current_user

我相信你可以弄清楚我在这里想要做什么。我意识到破坏包含在管理中,我在那里重复自己。有什么建议么?

编辑Yjerem 的答案是正确的,我只是将其更改为适合我的代码。这就是它的样子。

 if user.admin?
      can :manage, :all
      cannot :destroy, User, :id => user.id

正如 Yjerem 所说,在 cancan 中,能力优先级表明定义在较低位置的能力胜过它们之上的能力,因此管理员可以使用上面的代码管理除其下定义的能力之外的所有能力。

4

2 回答 2

5

阅读能力优先级,这里有一个适合你的例子!

基本上你想要的是cannot方法:

if user.admin?
      can :manage, :all
      cannot :destroy, User, :id => current_user.id

因为该cannot规则低于更一般的规则,所以它会覆盖它。

于 2011-05-10T20:59:20.250 回答
1

我会尝试这样的事情(假设你有一个帐户/用户模型):

def initialize(user)
  ...

  if user.admin?
    can :manage, :all
    can :destroy, Account do |account|
      account.user != user # admin can destroy all Accounts/Users except his own
    end
  end

  ...
end
于 2011-05-10T20:57:32.920 回答