2011-05-10 61 views
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还表示,在康康舞,能力优先指出的能力定义的低了下去胜过那些对他们这样管理员可以管理所有的除了什么是使用上面的代码在它之下定义。

回答

5

Ability Precedence,还有有一个例子只为你!

基本上你想要什么cannot方法:

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

因为cannot规则下面是更普遍的一个,它会覆盖它。

+0

我不认为''current_user'可以从Ability类中访问。 – mbreining 2011-05-10 21:05:01

+0

我正在寻找他们的文档中的东西。不能相信我错过了这一点。 – 2011-05-10 21:12:47

+0

@feelnoway'current_user'这里是传入Ability类的对象(它与您的答案中的'user'相同) – 2011-05-10 23:46:01

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 
+0

虽然我没有在我的文本编辑器中为此发生错误。 if user.admin? 可以:管理,:全部 可以:销毁,用户做| u | u.id!= user.id 结束 它仍然给我错误。我将快速查看优先权文件。 – 2011-05-10 21:22:37