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

Ruby on rails 如何将CanCan与多个设计模型集成?,ruby-on-rails,devise,cancan,Ruby On Rails,Devise,Cancan,如何为几个Desive模型定义功能?当前用户模型将传递给功能#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

如何为几个Desive模型定义功能?

当前用户模型将传递给
功能#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
这对我有用-

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

假设您的应用程序有两个独立的Desive-powered用户模型,分别称为
user
Admin
。这意味着您可以同时使用
current\u user
current\u admin
等方法

让我们进一步假设您只拥有/想要一个
能力
类,它包含您的所有CanCan权限设置

类能力
包括CanCan::能力
def初始化(用户)
user | |=user.new
案例使用者
当用户
can:创建、评论
can:read,:all
当管理员
can:manage,:all
结束
结束
结束
这正是其他人提出的建议,但你必须采取另一个步骤

默认情况下,CanCan假设方法
当前用户
存在,并将返回一个用户对象以与您的
能力
设置进行比较。但是,我们的管理员用户可以使用
current\u admin
找到。如果不告诉CanCan在哪里可以找到管理对象,它们就永远不会得到审查,因此也永远不会获得权限与管理员打交道时,我们必须更改默认设置。

将以下内容添加到
应用程序\u controller.rb

def当前能力
如果管理员登录?
@当前|u能力| |=能力。新建(当前|u管理员)
其他的
@当前|u能力| |=能力。新建(当前|u用户)
结束
结束
现在,我们的能力类将查看Admin对象(如果有),并在不存在Admin对象时返回到普通用户

进一步的开发允许我们将管理员权限移动到他们自己的单独的能力类中

def current_ability
  if admin_signed_in?
    @current_ability ||= AdminPowers.new(current_admin)
  else
    @current_ability ||= Ability.new(current_user)
  end
end
有关更多信息,请参见Wiki中的。感谢你为我指出了正确的文章

仅供参考--坎坎死了,万岁最新的错误修复和新功能。相同的名称空间,所以它只是gem文件中的gem替代品

gem 'cancancan', '~> 1.8'

谢谢你,斯蒂芬。不幸的是,它似乎不起作用。它只适用于用户案例,而不适用于管理员。每当我以管理员身份登录时,我只有来宾权限。可能我做错了什么,但我不明白。可能你的管理员没有调用
能力#初始化
。添加一些日志记录并签出。在搜索之后,我终于找到了完整的答案