update_attributes update rails column change attribute ruby-on-rails nested-attributes update-attributes

ruby on rails - rails - El atributo anidado update_attributes usa insertar en lugar de actualizar



save or update rails (4)

Me golpearon con esto en otra versión de Rails y pensé que iba a perder la cabeza. Al agregar update_only => true, lo resolví, creo que es un error en algún lugar de Rails.

Síntomas en mi caso: obtendría la asociación con el objeto pertenecido a eliminado y se crearía un nuevo objeto anidado, hasta que actualizase la página por primera vez. Después de eso funcionó correctamente.

En mi caso, agregué un método before_save a mi clase anidada e imprimí lo que guardó. También imprimí los atributos antes de llamar a update_attributes. Tenían el "parent_id" configurado correctamente. También incluí el campo de identificación oculto en el formulario, sin cambios, lo cual era normal ya que ya estaba incluido usando fields_for ...

Sorpresa: vi una llamada de actualización generando dos llamadas guardadas. En primer lugar, guardar tendría el id del objeto anidado pero nulo para el ID de types_to. - por lo que esto actualizaría el registro para establecer "parent_id" en nulo. El segundo guardado tendría el conjunto "parent_id" pero tendría el id del objeto anidado establecido en nulo.

Como dije, lo arreglé agregando update_only => true, pero creo que sigue siendo un error.

Me gustaría saber si los síntomas anteriores se aplican también a su caso para confirmar que se trata de un error.

Tengo una clase de usuario y perfil anidado de la siguiente manera:

class User < ActiveRecord::Base has_one :profile attr_accessible :profile_attributes accepts_nested_attributes_for :profile end class Profile < ActiveRecord::Base belongs_to :user attr_accessible :name end user = User.find(1) user.profile.id # => 1 user.update_attributes(profile_attributes: {name: ''some name''}) user.profile.id # => 2

No entiendo por qué los rieles están desechando el perfil antiguo y creando uno nuevo.

Utilizando

user.profile.update_attributes({name: ''some name''})

solo actualiza el perfil actual como se esperaba. Pero en ese caso no me estoy aprovechando de accept_nested_attributes_for

¿Alguien sabe por qué la actualización sucede de esta manera? Prefiero no terminar con una base de datos de filas de perfil que no estén conectadas a ningún usuario.


Para todos los que tengan el mismo problema en Rails 4: fields_for ya agrega el id para sus formularios anidados, pero tiene que permitir el parámetro: id. Solo permití un parámetro: object_name_id y como esto no produce ningún error, me tomó algo de tiempo hasta que lo vi en los registros del servidor. Esperemos que esto ayude a alguien a perder menos tiempo que yo en esto :)


Si verifica su formulario, necesita establecer el atributo id dentro del hash de atributo anidado para su objeto de perfil. Si la identificación no está establecida, ActiveRecord asume que es un nuevo objeto.

Por ejemplo, si tenía un formulario ERB creando un conjunto de parámetros de ''usuario'' con un hash de parámetro ''perfil_atributos'' anidado para el perfil anidado dentro del usuario, podría incluir un valor oculto para la identificación del perfil, como esto:

<%= hidden_field "user[profile_attributes][id]", @profile.id %>


update_only este problema agregando la opción update_only :

accepts_nested_attributes_for :profile, update_only: true

Ahora solo se crea un nuevo perfil si ya no existe uno.