Como você edita os atributos de um modelo de junção ao usar aceita_nested_attributes_for?
Eu tenho 3 modelos: tópicos e artigos unidos por linkers
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
Então, quando eu construo o artigo na "nova" ação do controlador de tópicos ...
@topic.articles.build
... e crie o formulário aninhado em topics / new.html.erb ...
<% form_for(@topic) do |topic_form| %>
...fields...
<% topic_form.fields_for :articles do |article_form| %>
...fields...
... O Rails cria automaticamente o linker, o que é ótimo. Agora, minha pergunta: Meu modelo de vinculador também tem atributos que desejo poder alterar por meio do formulário "novo tópico". Mas o linker que o Rails cria automaticamente tem valores nulos para todos os seus atributos, exceto topic_id e article_id. Como posso colocar campos para esses outros atributos de vinculador no formulário "novo tópico" para que eles não saiam nulo?
ruby-on-rails
join
nested
nested-forms
Arcolye
fonte
fonte
User
por meio de umAccount
usando umRelationship
comolinker
... mas não consigo descobrir como as ações new e create devem ser ... você se importaria?Respostas:
Descobri a resposta. O truque era:
Isso cria os vinculadores e, em seguida, o artigo para cada vinculador. Portanto, nos modelos:
topic.rb needs
accepts_nested_attributes_for :linkers
linker.rb needs
accepts_nested_attributes_for :article
Depois, na forma:
fonte
Quando o formulário gerado pelo Rails for submetido ao Rails
controller#action
, oparams
terá uma estrutura semelhante a esta (alguns atributos compostos adicionados):Observe como,
linkers_attributes
na verdade, um zero é indexadoHash
comString
chaves, e não umArray
? Bem, isso ocorre porque as chaves de campo do formulário que são enviadas ao servidor se parecem com estas:Criar o registro agora é tão simples quanto:
fonte
accepts_nested_attributes_for
Um GOTCHA rápido para quando usar has_one em sua solução. Vou apenas copiar e colar a resposta dada pelo usuário KandadaBoggu em esta discussão .
A
build
assinatura do método é diferente para associaçõeshas_one
ehas_many
.A sintaxe de construção para
has_many
associação:A sintaxe de construção para
has_one
associação:Leia a documentação da
has_one
associação para mais detalhes.fonte