【问题标题】:Rails Can Can Ability Class For Multiple Devise ModelsRails 可以为多个设计模型提供能力类
【发布时间】:2011-10-26 02:21:16
【问题描述】:

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

我正在使用 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/changing-defaults

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

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

【问题讨论】:

  • 啊,你是对的。我没有注意到您为 User 和 AdminUser 使用了单独的类。您应该能够更改 Active Admin 使用的类,但不是该系统的用户,我不确定它到底在哪里。可能应该检查你的初始化程序。

标签: ruby-on-rails ruby-on-rails-3 devise cancan activeadmin


【解决方案1】:

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

如果是这种情况,并且您的current_user 可以是UserAdminUser,那么在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

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多