¿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

Usertravés de unAccountuso de unRelationshipcomolinker... 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 :linkerslinker.rb necesita
accepts_nested_attributes_for :articleLuego en la forma:
fuente
Cuando el formulario generado por Rails se envía a Rails
controller#action,paramstendrá una estructura similar a esta (se agregaron algunos atributos inventados):Observe cómo en
linkers_attributesrealidad un índice ceroHashconStringclaves 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_forUn 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
buildfirma del método es diferente parahas_oneyhas_manyasociaciones.La sintaxis de compilación para la
has_manyasociación:La sintaxis de compilación para la
has_oneasociación:Leer la
has_oneasociación documentación de para obtener más detalles.fuente