簡體   English   中英

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或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。

枚舉映射到實數值。 所以也許像這樣:

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這樣的東西來管理授權可能是一個更好的主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM