我将如何定义几种设计模型的功能?
最佳答案
假设您的应用程序具有两个独立的,由Devise支持的用户模型,分别称为User
和Admin
。这意味着您可以并排使用current_user
和current_admin
之类的方法。
让我们进一步假设您只有/想要一个Ability
类,其中包含您所有的CanCan权限设置...
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
case user
when User
can :create, Comment
can :read, :all
when Admin
can :manage, :all
end
end
end
这正是其他人提出的建议,但是您还需要采取其他步骤。
默认情况下,CanCan假定存在
current_user
方法,并将返回一个User对象与您的Ability
设置进行比较。但是,可以使用current_admin
找到我们的管理员用户。如果不告诉CanCan在哪里可以找到管理对象,它们就永远不会得到审查,因此也就永远不会获得权限。 ,我们必须在与管理员打交道时更改默认设置。 将以下内容添加到
application_controller.rb
...def current_ability
if admin_signed_in?
@current_ability ||= Ability.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end
现在,我们的Ability类将查看Admin对象(如果有),而在没有对象时退回给普通用户。
进一步的发展使我们可以将Admin权限移到他们自己的单独的Ability类中。
def current_ability
if admin_signed_in?
@current_ability ||= AdminPowers.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end
有关更多信息,请参见Wiki中的Changing Defaults。感谢Stefan将我指向适当的文章。
仅供引用- CanCan已死,CanCanCan万岁! 包含最新的错误修复和新功能。相同的 namespace ,因此它只是Gemfile中的一个替代gem。
gem 'cancancan', '~> 1.8'