Rails imbriqué avec has_many :through, comment modifier les attributs de jointure modèle?
Comment vous modifiez les attributs de jointure modèle lors de l'utilisation de accepts_nested_attributes_for?
J'ai 3 modèles: Sujets et Articles rejoints par des 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 créer l'article correspondant dans la "nouvelle" action des sujets contrôleur...
@topic.articles.build
...et de faire de la imbriqué dans les rubriques/nouveau.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 excellent.
Maintenant pour ma question: Mon Linker modèle dispose également d'attributs que je veux être en mesure de modifier via le "nouveau sujet" de la forme. Mais l'éditeur de liens qui Rails crée automatiquement a néant valeurs pour l'ensemble de ses attributs, sauf topic_id et article_id. Comment puis-je mettre les champs pour les autres attributs de l'éditeur de liens dans le "nouveau sujet" formulaire de sorte qu'ils ne viennent pas de néant?
- Je suis en train de faire la même chose que vous, seulement dans une nouvelle/créer de l'action... je me demandais si vous pouviez partager vos actions de contrôleur. Je veux créer un
User
par le biais d'unAccount
à l'aide d'unRelationship
comme unlinker
... mais je ne peux pas comprendre ce qu'est la nouvelle et de créer des actions sont destinés à ressembler à... auriez-vous l'esprit? - robots.thoughtbot.com/...
Vous devez vous connecter pour publier un commentaire.
Trouvé la réponse. Le truc, c'était:
Qui construit les linkers, puis crée l'article pour chaque éditeur de liens. Ainsi, dans les modèles suivants:
sujet.rb besoins
accepts_nested_attributes_for :linkers
l'éditeur de liens.rb besoins
accepts_nested_attributes_for :article
Puis sous la forme:
Lorsque le formulaire généré par les Rails est soumis aux Rails
controller#action
, leparams
ont une structure similaire à ceci (certains composée d'attributs supplémentaires):Avis comment
linkers_attributes
est en fait un zéro indexésHash
avecString
clés, et non pas unArray
? Eh bien, c'est parce que le champ de formulaire touches qui sont envoyées au serveur ressembler à ceci:La création de la fiche est maintenant aussi simple que:
accepts_nested_attributes_for
Un rapide GOTCHA lors de l'utilisation de has_one dans votre solution.
Je vais juste copier coller de la réponse donnée par l'utilisateur KandadaBoggu dans ce fil.
La
build
signature de la méthode est différente pourhas_one
ethas_many
associations.La construction de la syntaxe pour
has_many
association:La construction de la syntaxe pour
has_one
association:Lire la
has_one
association la documentation pour plus de détails.