[英]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
我也願意
這可能嗎?
我花了很長時間試圖找出最好的方法來做到這一點。 看起來很奇怪的是,民謠人們希望你復制一大堆代碼!
在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.