through rails many how has form for fields_for example belongs and accepts_nested_attributes_for accepts ruby-on-rails-3 nested-attributes belongs-to

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