Wie bearbeiten Sie die Attribute eines Join-Modells, wenn Sie accept_nested_attributes_for verwenden?
Ich habe 3 Modelle: Themen und Artikel, denen Linker beitreten
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
Also, wenn ich den Artikel in der "neuen" Aktion des Themen-Controllers baue ...
@topic.articles.build
... und erstellen Sie das verschachtelte Formular in den Themen / new.html.erb ...
<% form_for(@topic) do |topic_form| %>
...fields...
<% topic_form.fields_for :articles do |article_form| %>
...fields...
... Rails erstellt automatisch den Linker, was großartig ist. Nun zu meiner Frage: Mein Linker-Modell hat auch Attribute, die ich über das Formular "Neues Thema" ändern möchte. Der von Rails automatisch erstellte Linker hat jedoch für alle Attribute außer topic_id und article_id keine Werte. Wie kann ich Felder für diese anderen Linkerattribute in das Formular "Neues Thema" einfügen, damit sie nicht gleich Null werden?
ruby-on-rails
join
nested
nested-forms
Arcolye
quelle
quelle
User
durch einAccount
Verwenden einesRelationship
alslinker
... erstellen, aber ich kann nicht herausfinden, wie die neuen und erstellten Aktionen aussehen sollen ... würde es Ihnen etwas ausmachen?Antworten:
Ich habe die Antwort herausgefunden. Der Trick war:
Dadurch werden die Linker und dann der Artikel für jeden Linker erstellt. Also, in den Modellen:
topic.rb braucht
accepts_nested_attributes_for :linkers
linker.rb braucht
accepts_nested_attributes_for :article
Dann in der Form:
quelle
Wenn das von Rails generierte Formular an Rails gesendet wird
controller#action
, hat dasparams
eine ähnliche Struktur (einige zusammengesetzte Attribute wurden hinzugefügt):Beachten Sie, wie
linkers_attributes
ist eigentlich eine NullHash
mitString
Indizes indiziert und nicht eineArray
? Dies liegt daran, dass die an den Server gesendeten Formularfeldschlüssel folgendermaßen aussehen:Das Erstellen des Datensatzes ist jetzt so einfach wie:
quelle
accepts_nested_attributes_for
Ein schnelles GOTCHA für die Verwendung von has_one in Ihrer Lösung. Ich werde einfach die Antwort des Benutzers KandadaBoggu in diesen Thread kopieren und einfügen .
Die
build
Methodensignatur unterscheidet sich fürhas_one
undhas_many
Assoziationen.Die Build-Syntax für die
has_many
Zuordnung:Die Build-Syntax für die
has_one
Zuordnung:Lesen Sie den
has_one
Verein Dokumentation für weitere Details.quelle