我想知道如何定义一个能力类并根据登录用户的不同为该能力类提供服务。
我正在使用Active Admin,可以和设计,我已经成功地创建了一个用户和AdminUser模型。
我的ability.rb里有这个
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if (user)
can :manage, Item
end
end
end
现在,我已经使用这个wiki条目来确定我们确实可以定义一个自定义能力文件,并使用它来代替ability.rb:
https://github.com/ryanb/cancan/wiki/changing-defaults
但是我想要做的是,如果“非管理用户”被登录,则可以使用ability.rb,如果用户管理被登录,则可以使用自定义能力。
侧问题:这样做可以使我不需要一个自定义的ability.rb文件,并且可以在一个ability.rb文件中设置权限吗?
发布于 2011-10-27 12:29:00
我从来没有真正使用过ActiveAdmin,所以我不完全确定我是否遗漏了什么,但是这个框架似乎并不依赖于CanCan。这就是为什么我假设您定义了一个current_ability
方法,就像在wiki中解释的那样,并且它是用Ability.new(current_user)
实例化的。
如果是这样,并且您的current_user
可以是User
或AdminUser
,那么在Ability
类中检查它就没有问题:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.kind_of? AdminUser
can :manage, Item
elsif user.kind_of? User
can :read, Item
end
end
end
您可以简单地查看用户的类型并相应地更改规则。您也可以使用is_a?
而不是kind_of?
来进行更严格的检查,但是它可能不是必需的,如果以后决定进行继承,可能会导致问题。
检查的另一种方法是在两个模型中定义一个admin?
方法。这可能是一种更好的方法,因为显式类型检查在ruby中并不是很流行--它常常限制您的选择。看起来可能是这样的:
class User < ActiveRecord::Base
def admin?
false
end
end
class AdminUser < ActiveRecord::Base
def admin?
true
end
end
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.admin?
can :manage, Item
else
can :read, Item
end
end
end
https://stackoverflow.com/questions/7898082
复制相似问题