Posted at

fields_forとdate_selectを組み合わせる

More than 5 years have passed since last update.

hoge has many fugasという関連があるとして、既存のfugaがあり、そこに新規でfugaを追加したいとする。

この場合、次の点を解決する必要がある。


  • 配列風パラメータ名のインデックスを空にしておく (A)

  • 既存のものにはidを送ってあげる (B)

厄介なのはdate_selectで、これはselectタグ個々にパラメータ名を設定することはできない。

ではどうやって(A)を実現するかというと、fields_forindex: 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]のなかにハッシュと配列が入り乱れてしまうから。