Comment éditez-vous les attributs d'un modèle de jointure lors de l'utilisation d'accept_nested_attributes_for?
J'ai 3 modèles: Thèmes et articles rejoints par 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
Alors quand je construis l'article dans la "nouvelle" action du contrôleur de sujets ...
@topic.articles.build
... et créez le formulaire imbriqué dans topics / new.html.erb ...
<% form_for(@topic) do |topic_form| %>
...fields...
<% topic_form.fields_for :articles do |article_form| %>
...fields...
... Rails crée automatiquement l'éditeur de liens, ce qui est génial. Maintenant pour ma question: mon modèle Linker a également des attributs que je souhaite pouvoir modifier via le formulaire "nouveau sujet". Mais l'éditeur de liens créé automatiquement par Rails a des valeurs nulles pour tous ses attributs à l'exception de topic_id et article_id. Comment puis-je mettre des champs pour ces autres attributs de l'éditeur de liens dans le formulaire "nouveau sujet" afin qu'ils ne soient pas nuls?
la source
User
enAccount
utilisant unRelationship
comme unlinker
... mais je ne peux pas comprendre à quoi ressemblent les actions de création et de création ... cela vous dérange?Réponses:
J'ai trouvé la réponse. L'astuce était:
Cela construit les liens, puis construit l'article pour chaque éditeur de liens. Donc, dans les modèles:
topic.rb a besoin de
accepts_nested_attributes_for :linkers
linker.rb
accepts_nested_attributes_for :article
Puis sous la forme:
la source
Lorsque le formulaire généré par Rails est soumis aux Rails
controller#action
, leparams
aura une structure similaire à celle-ci (quelques attributs composés ajoutés):Remarquez comment
linkers_attributes
est en fait un zéro indexéHash
avec desString
clés, et non unArray
? Eh bien, c'est parce que les clés de champ de formulaire qui sont envoyées au serveur ressemblent à ceci:La création de l'enregistrement est désormais aussi simple que:
la source
accepts_nested_attributes_for
Un rapide GOTCHA pour l'utilisation de has_one dans votre solution. Je vais simplement copier-coller la réponse donnée par l'utilisateur KandadaBoggu dans ce fil .
La
build
signature de la méthode est différente pour les associationshas_one
ethas_many
.La syntaxe de construction pour l'
has_many
association:La syntaxe de construction pour l'
has_one
association:Lisez la documentation de l'
has_one
association pour plus de détails.la source