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

Dre*_*son 14 ruby ruby-on-rails

有没有办法在没有大量重复的情况下为多个角色声明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
Run Code Online (Sandbox Code Playgroud)

我也愿意

  • A)定义可在不同角色之间共享的可访问属性数组
  • B)定义一组角色,而不是可以访问相同的属性

这可能吗?

Adr*_*eil 44

我花了很长时间试图找出最好的方法来做到这一点.看起来很奇怪的是,民谣人们希望你复制一大堆代码!

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

attr_accessible :name, :email, :as => [ :default, :admin ]    
attr_accessible :featured, :as => :admin
Run Code Online (Sandbox Code Playgroud)

你的模型中没有凌乱的红宝石阵列!

  • 就像说这是比接受的答案更漂亮和可读的代码. (2认同)

Tar*_*ast 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
Run Code Online (Sandbox Code Playgroud)