gpt4 book ai didi

ruby-on-rails - 如何将 CanCan 与多个设计模型集成?

转载 作者:行者123 更新时间:2023-12-04 00:50:45 25 4
gpt4 key购买 nike

我将如何为多个设计模型定义能力?

最佳答案

假设您的应用程序有两个独立的由 Devise 驱动的用户模型,名为 UserAdmin .这意味着您使用类似 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 对象(如果有),并在不存在时回退到普通用户。

进一步的开发允许我们将管理员权限移动到他们自己单独的能力类中......
def current_ability
if admin_signed_in?
@current_ability ||= AdminPowers.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end

欲了解更多信息,请参阅 Changing Defaults在维基。感谢 Stefan为我指出正确的文章。

仅供引用-- CanCan已死,万岁CanCanCan ! 最新的错误修复和新功能。相同的命名空间,所以它只是你 Gemfile 中的一个简单的 gem 替换。
gem 'cancancan', '~> 1.8'

关于ruby-on-rails - 如何将 CanCan 与多个设计模型集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11088795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com