#背景
便利なメソッドではあるがイマイチ使いこなせてないと思い、概要を調べ備忘録としてまとめた。
##fields_forとは
親モデルに紐付いた子モデルのデータを編集するときに使用します。
もう少しわかりやすく言うと、form内で異なるモデルを編集することができるということです。
特に画像を扱うときに使うことが多いかと思います。。(多分)
##使い方
####コントローラー
「new」も「build」もインスタンスを生成するメソッドだが、Railsの慣習的にモデル同士の関連付けの際は「build」を使う。
users_controller.rb
省略
def new
@user = User.new #空のインスタンスが生成される
@user.photos.build #UserモデルとPhotoモデルの関連付け
end
省略
####モデル
Userモデルの子に値するPhotoモデルを通して、photosテーブルに写真を保存する
user.rb
class User < ApplicationRecord
省略
accepts_nested_attributes_for :photos
end
####ビュー
モデルオプションに、@userをモデルオブジェクトとして扱う。こうすることで、URLとHTTPメソッドを自動推測してくれます。(今回の場合、@userは空なので、createアクションに飛びます)
また、fiels_forを使うことで、子モデル(今回ではPhotoモデル)に変更を加えることができる。
new.html.erb
<%= form_with model: @user do |f| %>
省略
<%= f.fields_for :photos do |i| %>
<%= image_tag(i.object.content) %> #画像があれば表示する
<%= i.file_field :image %>
<% end %>
省略
<%= f.submit "投稿", class: "btn btn-primary" %>
<% end %>