我使用的是动态attr_accessible
按这篇文章:mass_assignment_authorizer和嵌套属性
http://asciicasts.com/episodes/237-dynamic-attr-accessible
它工作正常。但是我还没有找到一种使嵌套属性工作的优雅方式。这里有一些简化的代码:
class Company < ActiveRecord::Base
has_many :employees
accepts_nested_attributes_for :employees
end
class Employee < ActiveRecord::Base
belongs_to :company
attr_protected :salary
attr_accessor :accessible
def mass_assignment_authorizer
if accessible == :all
ActiveModel::MassAssignmentSecurity::BlackList.new
else
super + (accessible || [])
end
end
end
比方说,我有一个管理界面与公司的RESTful形式。在此表格中,我有employees_attributes
的字段,其中包括用于创建新员工的空白字段。在这种情况下,我无法找到一种方法来呼叫Employee#accessible=
。通过ActiveRecord的源代码浏览,看来,这可能是不可能的:在一个非常深的调用堆栈上最遥远的,嵌套协会只是导致Employee.new
被调用的属性。
我还以为有关创建可以通过质量分配传递一个特殊的属性。如果属性的值是正确的代码,员工实例将设置@accessible
到:all
。但我不认为有一种方法可以保证在受保护属性之前设置此属性。
有没有什么办法,使动态保护的属性与嵌套属性的工作吗?
是的,你必须employees_attributes添加到您的访问属性列表。但真正的问题是在员工对象本身设置“可访问”属性。请注意,只有当您使用* dynamic *可访问属性时,这才是相关的,如问题开头引用的文章所述。 – rlkw1024 2012-11-08 22:23:56