estoy usando dinámica attr_accessible
según este artículo:mass_assignment_authorizer y atributos anidados
http://asciicasts.com/episodes/237-dynamic-attr-accessible
Trabaja muy bien. Pero no he encontrado una forma elegante de hacerlo funcionar con atributos anidados. Aquí hay un código simplificado:
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
Digamos que tengo una interfaz de administrador con un formulario RESTful para una empresa. En este formulario, tengo campos para employees_attributes
, que incluyen campos en blanco para crear nuevos empleados. No puedo encontrar una manera de llamar al Employee#accessible=
en este contexto. Al examinar el código fuente de ActiveRecord, parece que esto podría ser imposible: en la parte más remota de una pila de llamadas muy profunda, las asociaciones anidadas solo dan como resultado que se llame a Employee.new
con los atributos.
Pensé en crear un atributo especial que podría pasarse a través de la asignación masiva. Si el valor del atributo fuera el correcto, la instancia Employee establecería @accessible
en :all
. Pero no creo que haya una forma de garantizar que este atributo se establezca antes de los atributos protegidos.
¿Hay alguna manera de hacer que los atributos protegidos dinámicos funcionen con atributos anidados?
Sí, tiene que agregar employees_attributes a su lista de atributos accesibles. Pero el verdadero problema es establecer el atributo "accesible" en los propios objetos del empleado. Tenga en cuenta que esto solo es relevante cuando utiliza atributos accesibles * dinámicos *, según el artículo citado al principio de la pregunta. – rlkw1024