Rails – 如何为多个角色声明attr_accessible而不重复
有没有办法在没有大量重复的情况下为多个角色声明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)定义一组角色,而不是可以访问相同的属性
这可能吗?
所有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
我花了很长时间试图找出最好的方法来做到这一点。 看起来很奇怪的是,民谣民众会期望你复制一大堆代码!
在rails源中进行了一些挖掘之后,事实certificate你可以简单地传递一个数组来同时为多个角色分配属性(默认为默认的Active Record角色)
attr_accessible :name, :email, :as => [ :default, :admin ] attr_accessible :featured, :as => :admin
模型中没有凌乱的rubyarrays!
你尝试过这样的事情:
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