Rails - 如何为多个角色声明attr_accessible而不重复

时间:2011-07-29 19:10:02

标签: ruby-on-rails ruby

有没有办法在没有大量重复的情况下为多个角色声明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)定义一个角色数组,而不是可以访问相同的角色 属性

这可能吗?

3 个答案:

答案 0 :(得分:44)

我花了很长时间试图找出最好的方法来做到这一点。看起来很奇怪,rails民众会期望你复制一大堆代码!

在rails源中进行了一些挖掘之后,事实证明你可以简单地传递一个数组来同时为多个角色分配属性(默认为默认的Active Record角色)

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

模型中没有凌乱的ruby数组!

答案 1 :(得分:4)

所有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

答案 2 :(得分:3)

您尝试过类似的事情吗?

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