Rails 使用设计和枚举创建角色层次结构
Rails creating role hierarchy with devise and enum
我正在研究一个轻量级应用程序,我想实现一个超级简单的角色结构。目前我正在使用枚举来设置角色,但我想实现某种层次结构。
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 < active_registered_user < admin < account_admin < vip .
他们几乎可以访问他们下面的所有角色。
因此,如果有人说 if current_user.admin?
如果我是 account_admin 或贵宾,那将 return 为真。
我正想做这样的事情
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
但后来我不得不运行这个方法无处不在!有更多 ruby 的方法吗?
任何帮助或设计见解将不胜感激。
注:
枚举允许一些很酷的活动记录调用:
user.admin! # sets the role to "admin"
user.admin? # => true
user.role # => "admin"
如果你想看看我是怎么打电话的 user.role。
枚举映射到实数值。所以也许是这样的:
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 的东西来管理授权可能是一个更好的主意。
我正在研究一个轻量级应用程序,我想实现一个超级简单的角色结构。目前我正在使用枚举来设置角色,但我想实现某种层次结构。
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 < active_registered_user < admin < account_admin < vip .
他们几乎可以访问他们下面的所有角色。
因此,如果有人说 if current_user.admin?
如果我是 account_admin 或贵宾,那将 return 为真。
我正想做这样的事情
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
但后来我不得不运行这个方法无处不在!有更多 ruby 的方法吗?
任何帮助或设计见解将不胜感激。
注:
枚举允许一些很酷的活动记录调用:
user.admin! # sets the role to "admin"
user.admin? # => true
user.role # => "admin"
如果你想看看我是怎么打电话的 user.role。
枚举映射到实数值。所以也许是这样的:
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 的东西来管理授权可能是一个更好的主意。