Jak edytować atrybuty modelu łączenia przy użyciu accepts_nested_attributes_for?
Mam 3 modele: tematy i artykuły połączone przez łączników
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
Kiedy więc buduję artykuł w „nowej” akcji kontrolera tematów ...
@topic.articles.build
... i utwórz zagnieżdżony formularz w topic / new.html.erb ...
<% form_for(@topic) do |topic_form| %>
...fields...
<% topic_form.fields_for :articles do |article_form| %>
...fields...
... Railsy automatycznie tworzą konsolidator, co jest świetne. A teraz moje pytanie: mój model Linkera również ma atrybuty, które chcę zmienić za pomocą formularza „nowy temat”. Jednak linker, który Railsy automatycznie tworzy, ma wartości zerowe dla wszystkich swoich atrybutów z wyjątkiem topic_id i article_id. Jak mogę umieścić pola dla tych innych atrybutów linkera w formularzu „nowego tematu”, aby nie wychodziły zera?
ruby-on-rails
join
nested
nested-forms
Arcolye
źródło
źródło
User
zaAccount
pomocą aRelationship
jakolinker
... ale nie mogę dowiedzieć się, jak mają wyglądać nowe i tworzone działania ... czy miałbyś coś przeciwko?Odpowiedzi:
Zrozumiałem odpowiedź. Sztuczka była taka:
To buduje konsolidatory, a następnie tworzy artykuł dla każdego konsolidatora. Tak więc w modelach:
topic.rb potrzebuje
accepts_nested_attributes_for :linkers
linker.rb
accepts_nested_attributes_for :article
Następnie w formie:
źródło
Kiedy formularz wygenerowany przez Railsy zostanie przesłany do Railsów
controller#action
,params
będzie miał strukturę podobną do tej (dodano niektóre zmyślone atrybuty):Zwróć uwagę, jak
linkers_attributes
właściwie jest indeksowany zeroHash
zString
kluczami, a nieArray
? Dzieje się tak, ponieważ klucze pól formularza wysyłane do serwera wyglądają następująco:Tworzenie rekordu jest teraz tak proste, jak:
źródło
accepts_nested_attributes_for
Szybka GOTCHA do korzystania z has_one w Twoim rozwiązaniu. Po prostu skopiuję wklej odpowiedź udzieloną przez użytkownika KandadaBoggu w tym wątku .
build
Podpis metoda jest różna dlahas_one
ihas_many
stowarzyszenia.Składnia kompilacji dla
has_many
asocjacji:Składnia kompilacji dla
has_one
asocjacji:Przeczytaj dokumentację
has_one
stowarzyszenia, aby uzyskać więcej informacji.źródło