1. ホーム
  2. ruby-on-rails

[解決済み] Railsのネストされたフォームでhas_many :sroughを使用して、結合モデルの属性を編集するにはどうすればよいですか?

2022-11-28 16:18:11

質問

accepts_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

そこで、トピックコントローラの "new" アクションで記事をビルドすると...。

@topic.articles.build

...そして、topics/new.html.erbにネストされたフォームを作る...。

<% form_for(@topic) do |topic_form| %>
  ...fields...
  <% topic_form.fields_for :articles do |article_form| %>
    ...fields...

...Railsは自動的にリンカーを作成します。 では、私の質問です。 私のリンカーモデルには、"new topic"フォームから変更できるようにしたい属性もあります。しかし、Railsが自動的に作成するリンカーは、topic_idとarticle_id以外のすべての属性にnil値を持っています。どうすれば、他のリンカー属性のフィールドを"new topic"フォームに入れ、nilにならないようにできるでしょうか?

どのように解決するのですか?

答えがわかりました。コツがあった。

@topic.linkers.build.build_article

これでリンカーが構築され、それぞれのリンカーに対応した記事が構築されます。つまり、モデルの中で

topic.rb が必要です。 accepts_nested_attributes_for :linkers

linker.rbに必要なもの accepts_nested_attributes_for :article

では、フォームに

<%= form_for(@topic) do |topic_form| %>
  ...fields...
  <%= topic_form.fields_for :linkers do |linker_form| %>
    ...linker fields...
    <%= linker_form.fields_for :article do |article_form| %>
      ...article fields...