accepts_nested_attributes_for, FormOptionsHelper.selectのauxiliary hidden field

dhhがaccepts_nested_attributes_forをkillしたがってる件

https://github.com/rails/rails/pull/26976#pullrequestreview-8449983

代替としてはActiveModel内に頑張って書いていく

form helperのselectのauxiliary hidden field

https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/actionview/lib/action_view/helpers/form_options_helper.rb#L137-L143

multiple: trueにする場合は補助的なhiddenタグがデフォルトで追加されます。
この挙動が不要な場合はinclude_hidden: falseで無効にすることができます。

f:id:ta_watanabe:20220406225456p:plain

html.erb

<%= form_with do |form| %>
  <%= form.select("person_name", ["佐藤", "鈴木", "高橋"], {}, { multiple: true }) %>
<% end %>

htmlの出力結果

<form action="/home/form_options_helper_select" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="xxxx" autocomplete="off" />
  <input name="person_name[]" type="hidden" value="" autocomplete="off" /><select multiple="multiple" name="person_name[]" id="person_name"><option value="佐藤">佐藤</option>
<option value="鈴木">鈴木</option>
<option value="高橋">高橋</option></select>
</form>

rails cでも確認できる

[35] pry(main)> helper.select("post", "person_name", ["佐藤", "鈴木", "高橋"], {}, { multiple: true })
=> "<input name=\"post[person_name][]\" type=\"hidden\" value=\"\" autocomplete=\"off\" /><select multiple=\"multiple\" name=\"post[person_name][]\" id=\"post_person_name\"><option value=\"佐藤\">佐藤</option>\n<option value=\"鈴木\">鈴木</option>\n<option value=\"高橋\">高橋</option></select>"