【问题标题】:Rails creating role hierarchy with devise and enumRails 使用设计和枚举创建角色层次结构
【发布时间】:2015-03-11 16:30:01
【问题描述】:

我正在使用一个轻量级应用程序,我想实现一个超级简单的角色结构。目前我正在使用枚举来设置角色,但我想实现某种层次结构。

enum role: [:registered_user, :active_registered_user, :admin, :account_admin, :vip]
after_initialize :set_default_role, :if => :new_record?

def set_default_role
  self.role ||= :registered_user
end

这就是我在用户模型上定义角色的方式,我想做的是让registered_user

他们几乎可以访问他们下面的所有角色。

所以如果有人说if current_user.admin? 如果我是帐户管理员或vip,它将返回true。

我正在考虑做一些这样的事情

def has_access?(user, access_role)
  access_hash = {
    "vip" => ['vip', 'account_admin', 'admin', 'active_registered_user', 'registered_user'],
    "account_admin" => ['account_admin', 'admin', 'active_registered_user', 'registered_user'],
    "admin" => ['admin', 'active_registered_user', 'registered_user'],
    "active_registered_user" => ['active_registered_user', 'registered_user'],
    "registered_user" => ['registered_user']
  }
  access_hash.[user.role].include?(access_role)
end

但是我必须到处运行这个方法!有没有更红宝石的方式来做到这一点?

我们将不胜感激任何帮助或设计见解。

注意:

枚举允许一些很酷的活动记录调用:

user.admin! # sets the role to "admin"
user.admin? # => true
user.role  # => "admin"

如果你想看看我是如何调用 user.role 的。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 devise enums


    【解决方案1】:

    枚举映射到一个实数值。所以也许是这样的:

    def access_level
      self.class.roles[role]
    end
    
    def do_a_thing_only_admins_can_do(user)
      return unless user.access_level >= 2
      do_thing
    end
    
    def do_a_thing_only_vips_can_do(user)
      return unless user.access_level >= 4
    end
    

    注意:从长远来看,使用Cancan 之类的东西来管理授权可能是一个更好的主意。

    【讨论】:

    • 话虽如此,我建议为枚举分配一个值。这样,您可以更清晰地控制自己的角色。否则,您可能会在添加新角色时意外转移角色。
    • 非常感谢!我喜欢这种方法。我本来打算用 Cancan,但对于这么小的应用程序来说似乎有点过分了
    猜你喜欢
    • 2016-05-25
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2010-11-19
    • 2020-11-14
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多