Rails – 1つのフォームで複数モデルのデータを扱う方法

 

Ruby on Railsで
・1つのフォームで
・複数のモデルのデータを扱いたい
場合の実装方法について調べたので、メモです。

例えば、会員登録時に
・名前はUserモデル
・複数登録可能な趣味はHobbyモデル
となっているが、1つの会員登録フォームで一気に登録・編集を行いたい場合です。

#以下は、Rails初心者の私個人のメモが目的のため、情報の正確性にはご留意下さい。

1つのフォームで複数モデルを扱う際の課題

form_forメソッドを使ってフォームを作る場合、

<%= form_for (モデルオブジェクト) do |f| %>
  ・・・
<% end %>

と記載します。

ポイントは、form_forでは「1つのモデルオブジェクト」を指定している点です。

そのため、このフォーム内では、指定していないモデルを扱うことは出来ません。

解決方法

解決方法は、
・accepts_nested_attributes_forでモデルを階層化
・form_forメソッド内でfields_forメソッドを使う
です。

先述のUserモデルとHobbyモデルの場合、Userモデルに以下の記述を加えます。

accepts_nested_attributes_for :hobbies

これでUserモデルとHobbyモデルに親子関係が成立。

そして、form_forメソッド内で

<%= form_for (@user) do |f| %>
  ・・・
  <%= f.fields_for :hobbies do |h|
    ・・・
  <% end %>
<% end %>

と記載すると、fields_forメソッド内ではHobbyモデルのデータが扱えます。

注意点

formから渡される値”params”も階層構造になります。

actionメソッド内での処理に注意が必要です。

詳細はShred IT!!!!の「Railsで階層化された複数モデルに対応するフォームの作り方」を参考。

なお、その他に参考にさせて頂いた記事は以下の通りです。
Railsのfields_forで異なるモデルを編集するフォームを作成(EasyRamble)

■関連記事:
Rails – nested_formを使う時は”nested_form_for”を利用
TechAcademyの体験談 – 良い所・悪い所
フリーランスの名刺に自宅住所は載せるか?
会社を辞めて個人事業主になる前にやるべき7つのこと

スポンサード リンク

  関連記事

Ruby on Rails
Rails – nested_formを使う時は”nested_form_for”を利用(”form_for”ではない)

Ruby on Railsでは、フォーム中に入力項目(input)を追加可能とす …

Ruby on Rails
Rails – pathヘルパーでURLがスラッシュではなくドットになる

products_path()というヘルパーが存在した場合、products_p …

↑PageTop