簡體   English   中英

Rails - 如何為多個角色聲明attr_accessible而不重復

[英]Rails - How to declare attr_accessible for multiple roles without duplication

有沒有辦法在沒有大量重復的情況下為多個角色聲明attr_accessible?

如果我有多個用戶角色,並且允許每個角色編輯不同的屬性子集,那么這就是我的attr_accessible聲明:

attr_accessible :first_name, :last_name, :active, :as => :admin
attr_accessible :first_name, :last_name, :as => :manager
attr_accessible :first_name, :last_name, :as => :guest

我也願意

  • A)定義可在不同角色之間共享的可訪問屬性數組
  • B)定義一組角色,而不是可以訪問相同的屬性

這可能嗎?

我花了很長時間試圖找出最好的方法來做到這一點。 看起來很奇怪的是,民謠人們希望你復制一大堆代碼!

在rails源中進行了一些挖掘之后,事實證明你可以簡單地傳遞一個數組來同時為多個角色分配屬性(默認為默認的Active Record角色)

attr_accessible :name, :email, :as => [ :default, :admin ]    
attr_accessible :featured, :as => :admin

你的模型中沒有凌亂的紅寶石陣列!

所有ruby代碼仍然只是ruby代碼......因此是無限可攻擊的。 例如

ROLES = [:admin, :manager, :support, :user, :guest]
ACTIVE_ROLES = [:admin, :support]
ROLES.each do |role|
   fields = [:first_name, :last_name]
   fields += [:active] if ACTIVE_ROLES.include?(role)
   attr_accessible *fields, :as => role
end

你嘗試過這樣的事情:

COMMON_FIELDS = [:first_name, :last_name]

attr_accessible COMMON_FIELDS | [:active, :as => :admin]
attr_accessible COMMON_FIELDS | [:as => :manager]
attr_accessible COMMON_FIELDS | [:as => :guest]

另一種可能的方式(未經測試):

attr_accessible :first_name, :last_name
ADMIN_ACCESSIBLE   = [:active]
MANAGER_ACCESSIBLE = []
GUEST_ACCESSIBLE   = []

protected

def mass_assignment_authorizer
  if role == :all
    self.class.protected_attributes
  else
    super + (eval("#{role}_accessible".upcase) || [])
  end
end

暫無
暫無

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

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