ruby on rails 3 - rails - Does accepts_nested_attributes_for work with belongs_to?
rails fields_for (3)
He estado recibiendo todo tipo de información conflictiva con respecto a esta pregunta básica, y la respuesta es bastante crucial para mis problemas actuales. Entonces, de manera muy simple, en Rails 3, ¿está permitido o no el uso de accept_nested_attributes_for con una relación belongs_to?
class User < ActiveRecord::Base
belongs_to :organization
accepts_nested_attributes_for :organization
end
class Organization < ActiveRecord::Base
has_many :users
end
En una vista:
= form_for @user do |f|
f.label :name, "Name"
f.input :name
= f.fields_for :organization do |o|
o.label :city, "City"
o.input :city
f.submit "Submit"
El doc epochwolf citó estados en la primera línea "Los atributos anidados le permiten guardar atributos en los registros asociados a través del padre ". (mi énfasis).
Puede que le interese esta otra pregunta SO, que está en la misma línea que esta . Describe dos posibles soluciones: 1) mover los attributes_nested_attributes al otro lado de la relación (en este caso, organización), o 2) usar el método de compilación para construir la organización en el usuario antes de representar el formulario.
También encontré una idea que describe una posible solución para usar accepts_nested_attributes con una relación belongs_to si está dispuesto a tratar con un pequeño código adicional. Esto también usa el método de build
.
Los atributos anidados parecen funcionar bien para una asociación belongs_to a partir de Rails 4. Se pudo haber cambiado en una versión anterior de Rails, pero probé en 4.0.4 y definitivamente funciona como se esperaba.
Para la asociación belongs_to
en Rails 3.2, el modelo anidado necesita los dos pasos siguientes:
(1) Agregue nuevo attr_accessible
a su modelo hijo (Modelo de usuario).
accepts_nested_attributes_for :organization
attr_accessible :organization_attributes
(2) Agregue @user.build_organization
a su controlador hijo (controlador de usuario) para crear una organization
columnas.
def new
@user = User.new
@user.build_organization
end