【发布时间】:2012-06-18 18:25:45
【问题描述】:
我将如何定义多个设计模型的能力?
【问题讨论】:
标签: ruby-on-rails devise cancan
我将如何定义多个设计模型的能力?
【问题讨论】:
标签: ruby-on-rails devise cancan
假设您的应用有两个独立的 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 存在,并将返回一个用户对象以与您的 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 对象(如果可用),并在没有可用时返回普通用户。
进一步的开发允许我们将管理员权限转移到他们自己单独的能力类中......
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! 更新了错误修复和新功能。相同的命名空间,所以它只是 Gemfile 中的一个插入式 gem 替换。
gem 'cancancan', '~> 1.8'
【讨论】:
这对我有用 -
class Ability
include CanCan::Ability
def initialize(user)
if user.is_a?(Admin)
can :manage, :all
elsif user.is_a?(User)
can :create, Comment
can :read, :all
else
can :read, :all
end
end
end
【讨论】:
当前用户模型被传递给Ability#initialize,所以你可以检查它的类:
class Ability
include CanCan::Ability
def initialize(model)
case model
when Admin
can :manage, :all
when User
can :create, Comment
can :read, :all
else
can :read, :all
end
end
end
【讨论】:
Ability#initialize。添加一些日志记录并查看Changing Defaults。