我想知道如何根据已登录的用户定义能力等级并提供该能力等级。
我正在使用Active Admin,Can Can和Devise,我已成功创建了User和AdminUser模型。
我的能力就是这个.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文件中设置权限吗?
答案 0 :(得分:12)
我从未真正使用过ActiveAdmin,所以我不确定我是否遗漏了某些内容,但似乎该框架并不依赖于CanCan。这就是为什么我假设您正在定义一个{w}中解释的current_ability
方法,并使用Ability.new(current_user)
进行实例化。
如果是这种情况,并且您的current_user
可以是User
或AdminUser
,那么在Ability
类中检查它是没有问题的:< / p>
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