今回は、「fields_for」で「file_field」を使用しようとしたところ、ビューに反映されずに苦戦したので、備忘録として解決した方法を記載します。
同じ悩みを抱えた方の一助になると幸いです。
※この記事ではfields_for とaccepts_nested_attributes_for を使ったフォーム作成手順を解説するものではありません。
#今回登場するモデル
・(親)postモデル
・(子)imageモデル
postモデルとimageモデルaccepts_nested_attributes_forでアソシエーションしております。
想定
ツイッターやFBのようなSNSを作成。
「form_for」を用いて投稿フォームを作成するところです。
文章 →postモデル
写真 →imageモデル
に保存したく、以下のようにビューを作成しました。
間違えたコード
(わかりやすいように関係箇所のみ抜粋してます)
.form__contents
= form_for @post, id: "new_post" do |f|
.title
= f.text_field :title
.text
= f.text_area :text
.image
= f.fields_for :images do |i|
= i.file_field :image
= f.submit "投稿!"
よし、コーディング完了!!いざビューへ!!
…あれ、、「= f.fields_for :images do |i| 」以下が反映されてないぞ…
しかもエラーも出てないから何が悪いのかわからない…調べた通りやったのに…
上手く行ったコード
.form__contents
= form_for @post, id: "new_post" do |f|
.title
= f.text_field :title
.text
= f.text_area :text
.image
= f.fields_for :images, @post.images.build do |i|
= i.file_field :image
= f.submit "投稿!"
まとめ
私はてっきり「fields_for」では保存したいモデルを書けば「file_field」で記載したカラムに保存してもらえるとばかり思っていたのですが、
「fields_for」の第二引数に子モデルのインスタンスも渡してあげないとダメみたいでした。
なるほど…たしかに「form_for」でもインスタンス渡してあげてるんだから当たり前か。
(そもそも images.build インスタンス作れるって初めて知りました!)
どんどはれ。