¿Cómo se editan los atributos de un modelo de combinación cuando se utiliza accept_nested_attributes_for?
Tengo 3 modelos: Temas y artículos unidos por vinculadores
class Topic < ActiveRecord::Base
has_many :linkers
has_many :articles, :through => :linkers, :foreign_key => :article_id
accepts_nested_attributes_for :articles
end
class Article < ActiveRecord::Base
has_many :linkers
has_many :topics, :through => :linkers, :foreign_key => :topic_id
end
class Linker < ActiveRecord::Base
#this is the join model, has extra attributes like "relevance"
belongs_to :topic
belongs_to :article
end
Entonces, cuando construyo el artículo en la acción "nueva" del controlador de temas ...
@topic.articles.build
... y crea el formulario anidado en topics / new.html.erb ...
<% form_for(@topic) do |topic_form| %>
...fields...
<% topic_form.fields_for :articles do |article_form| %>
...fields...
... Rails crea automáticamente el enlazador, lo cual es genial. Ahora para mi pregunta: Mi modelo de Linker también tiene atributos que quiero poder cambiar a través del formulario de "nuevo tema". Pero el enlazador que Rails crea automáticamente tiene valores nulos para todos sus atributos, excepto topic_id y article_id. ¿Cómo puedo poner campos para esos otros atributos del enlazador en el formulario "nuevo tema" para que no salgan nulos?
fuente
User
través de unAccount
uso de unRelationship
comolinker
... pero no puedo entender cómo deben verse las acciones nuevas y de creación ... ¿te importaría?Respuestas:
Descubrí la respuesta. El truco fue:
Eso crea los enlazadores y luego crea el artículo para cada enlazador. Entonces, en los modelos:
topic.rb necesita
accepts_nested_attributes_for :linkers
linker.rb necesita
accepts_nested_attributes_for :article
Luego en la forma:
fuente
Cuando el formulario generado por Rails se envía a Rails
controller#action
,params
tendrá una estructura similar a esta (se agregaron algunos atributos inventados):Observe cómo en
linkers_attributes
realidad un índice ceroHash
conString
claves y no unArray
? Bueno, esto se debe a que las claves de campo de formulario que se envían al servidor tienen este aspecto:Crear el registro ahora es tan simple como:
fuente
accepts_nested_attributes_for
Un GOTCHA rápido para cuando use has_one en su solución. Simplemente copiaré y pegaré la respuesta dada por el usuario KandadaBoggu en este hilo .
La
build
firma del método es diferente parahas_one
yhas_many
asociaciones.La sintaxis de compilación para la
has_many
asociación:La sintaxis de compilación para la
has_one
asociación:Leer la
has_one
asociación documentación de para obtener más detalles.fuente