hoge has many fugas
という関連があるとして、既存のfugaがあり、そこに新規でfugaを追加したいとする。
この場合、次の点を解決する必要がある。
- 配列風パラメータ名のインデックスを空にしておく (A)
- 既存のものにはidを送ってあげる (B)
厄介なのはdate_select
で、これはselect
タグ個々にパラメータ名を設定することはできない。
ではどうやって(A)を実現するかというと、fields_for
にindex: nil
というオプションを渡しておく。こうすることでprefix
オプションのあとに[][date(1i)]
などが付加されるようになる。
- @fugas = [@hoge.fugas, Fuga.new].flatten
= form_for @hoge do |f|
%ul
- @fugas.each do |fuga|
%li
= f.fields_for :fugas, fuga, index: nil do |ff|
- if fuga.persisted?
= ff.hidden_field :id, value: fuga.id, name: "hoge[fugas_attributes][][id]"
= ff.text_field :name, name: "hoge[fugas_attributes][][name]"
= ff.date_select :date, prefix: "hoge[fugas_attributes]"
%div
= f.submit
ちなみにdate_select
以外でname
オプションを指定しているのは、こうしないと[]
のなかにid値が入れられてしまい、hoge[fugas_attributes]
のなかにハッシュと配列が入り乱れてしまうから。