Как вы редактируете атрибуты модели соединения при использовании accept_nested_attributes_for?
У меня есть 3 модели: темы и статьи, к которым присоединились линкеры
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
Поэтому, когда я создаю статью в «новом» действии контроллера тем ...
@topic.articles.build
... и сделайте вложенную форму в themes / new.html.erb ...
<% form_for(@topic) do |topic_form| %>
...fields...
<% topic_form.fields_for :articles do |article_form| %>
...fields...
... Rails автоматически создает компоновщик, и это здорово. Теперь у меня вопрос: у моей модели компоновщика также есть атрибуты, которые я хочу изменить с помощью формы «новая тема». Но компоновщик, который Rails автоматически создает, имеет нулевые значения для всех своих атрибутов, кроме topic_id и article_id. Как я могу поместить поля для этих других атрибутов компоновщика в форму «новая тема», чтобы они не были нулевыми?
ruby-on-rails
join
nested
nested-forms
Арколай
источник
источник
User
сквозной,Account
используяRelationship
в качествеlinker
... но я не могу понять, как должны выглядеть действия new и create ... не возражаете?Ответы:
Разобрался с ответом. Уловка заключалась в следующем:
Это создает компоновщики, а затем создает статью для каждого компоновщика. Итак, в моделях:
topic.rb нужен
accepts_nested_attributes_for :linkers
linker.rb нужен
accepts_nested_attributes_for :article
Затем в форме:
источник
Когда форма, сгенерированная Rails, отправляется в Rails
controller#action
, онаparams
будет иметь аналогичную структуру (добавлены некоторые выдуманные атрибуты):Обратите внимание, как
linkers_attributes
на самом деле индексируется нулемHash
сString
ключами, а неArray
? Это потому, что ключи поля формы, которые отправляются на сервер, выглядят так:Создать запись теперь так же просто, как:
источник
accepts_nested_attributes_for
Быстрый GOTCHA при использовании has_one в вашем решении. Я просто скопирую и вставлю ответ пользователя KandadaBoggu в этой теме .
build
Метод подпись различна дляhas_one
иhas_many
ассоциаций.Синтаксис сборки для
has_many
ассоциации:Синтаксис сборки для
has_one
ассоциации:Прочтите документацию
has_one
ассоциации для более подробной информации.источник