Rails使用设计和枚举创建角色层次结构

时间:2015-03-11 16:30:02

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

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

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

这就是我如何定义用户模型上的角色,我想要做的就是让register_user< active_registered_user< admin< account_admin< VIP。

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

所以,如果我说的是if current_user.admin?,如果我是一个account_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

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

非常感谢任何帮助或设计见解。

注意:

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

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

如果您想看看我如何调用user.role。

1 个答案:

答案 0 :(得分:2)

枚举映射到实数值。所以可能是这样的:

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之类的东西来管理授权可能是一个更好的主意。