10

我想知道如何定义一个能力类并根据已登录的用户为该能力类服务。

我正在使用 Active Admin、Can Can 和 Devise,并且我已经成功创建了一个 User 和一个 AdminUser 模型。

我有这个能力.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    if (user)
      can :manage, Item
    end
  end
end

现在我已经使用这个 wiki 条目来确定我们确实可以定义一个自定义能力文件并使用它来代替ability.rb:

https://github.com/ryanb/cancan/wiki/changeing-defaults

但我想要做的是,如果“非管理员用户”已登录,则能够使用 ability.rb,如果用户管理员已登录,则能够使用自定义 abilty。

附带问题:是否可以这样做,以便我不需要自定义的并且可以在一个ability.rb 文件中设置权限?

4

1 回答 1

12

我从来没有真正使用过 ActiveAdmin,所以我不完全确定我是否遗漏了一些东西,但该框架似乎并不依赖于 CanCan。这就是为什么我假设您正在定义一个current_ability类似 wiki 中解释的方法,并且它是用Ability.new(current_user).

如果是这种情况,并且您current_user可以是 aUser或 an AdminUser,那么在Ability课堂上检查它就没有问题:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    if user.kind_of? AdminUser
      can :manage, Item
    elsif user.kind_of? User
      can :read, Item
    end
  end
end

您可以简单地查看用户的类型并相应地更改规则。您也可以使用is_a?代替kind_of?进行更严格的检查,但它可能不是必需的,如果您决定稍后进行继承,可能会导致问题。

您可以检查的另一种方法是admin?在两个模型中定义一个方法。这可能是一种更好的方法,因为显式类型检查在 ruby​​ 中不是很流行——它通常会限制你的选择。它可能看起来像这样:

class User < ActiveRecord::Base
  def admin?
    false
  end
end

class AdminUser < ActiveRecord::Base
  def admin?
    true
  end
end

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    if user.admin?
      can :manage, Item
    else
      can :read, Item
    end
  end
end
于 2011-10-27T12:29:00.907 回答