限制管理员使用cancan销毁自己的帐户

时间:2011-05-10 20:51:55

标签: ruby-on-rails cancan restrict

以下是我的能力课程中的代码片段

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中,能力优先级表明定义的能力低于他们,因此管理员可以使用上面的代码管理除了在​​其下定义的所有内容。

2 个答案:

答案 0 :(得分:5)

阅读Ability Precedence,有一个例子适合你!

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

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

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

答案 1 :(得分: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