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