如何惨惨与多个色器件模型集成?(How to integrate CanCan with multi

2019-06-25 14:13发布

我怎么会去定义几个色器件模型的能力?

Answer 1:

让我们假设你的应用程序有两个独立的设计,供电用户模型叫做UserAdmin 。 这意味着你使用像方法current_usercurrent_admin并排。

让我们进一步假设你只需要/想一个Ability类,它包含了所有的康康舞权限设置...

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

这也正是其他人提出的,但还有另外一个步骤中,您必须考虑。

默认情况下,惨惨假设方法current_user存在,并且会返回一个User对象与你的比较Ability设置。 然而,我们的管理员用户可以使用发现current_admin 。 瞒着惨惨哪里可以找到管理对象,他们从来没有得到审查,因此从来没有得到许可; 与管理员打交道时,我们必须改变默认设置。

添加到以下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

现在,我们的能力类将看管理对象(如果有),并依傍普通用户当没有出现。

进一步发展使我们能够管理权限转移到自己独立的能力类...

def current_ability
  if admin_signed_in?
    @current_ability ||= AdminPowers.new(current_admin)
  else
    @current_ability ||= Ability.new(current_user)
  end
end

欲了解更多信息,请参见更改默认设置在Wiki。 荣誉对斯特凡在适当文章指着我。

仅供参考- 康康舞是死的,万岁CanCanCan ! 了解最新的bug修复和新功能。 同样的命名空间,所以它只是一个简易的宝石替换您的Gemfile。

gem 'cancancan', '~> 1.8'


Answer 2:

当前用户模式传递给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


Answer 3:

这为我工作 -

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


文章来源: How to integrate CanCan with multiple devise models?