3

これが私の能力クラスからの私のコードのスニペットです

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

私がここで何をしようとしているのか、あなたならきっと理解できると思います。破棄が管理に含まれていることに気づき、そこで繰り返しています。助言がありますか?

EDIT Yjeremの答えは正しいもので、コードに合わせて変更しました。これは、それがどのように見えるかです。

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

Yjerem も言ったように、cancan では、能力の優先順位は、下に定義された能力がそれらの上にあるものよりも優先されるため、管理者は上記のコードを使用してその下に定義されているものを除くすべてを管理できます。

4

2 に答える 2

5

Ability Precedenceを読んでください。あなたのためだけの例があります!

基本的にあなたが望むのは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 に答える