フォームで、date_selectのinputをhiddenにしたいシチュエーションがある。
(例えば、登録(new)->確認(confirm)->(create)->完了(complete)となる画面の確認画面など)
このときに、hidden_filedにしてしまうと、
<%= form_for(@user, url: { action: 'create' }) do |form| %>
<%# 省略 %>
<div>
<%= t '.birth_date' %>: <%= @user.birth_date %>
<%= form.hidden_field :birth_date, id: :user_date, discard_year: true, discard_month: true, discard_day: true %>
</div>
<%# 省略 %>
<% end %>
create
アクションに birth_date"=>"{1=>2018, 2=>5, 3=>24}
のような形式で値が渡ってしまい、
モデル.newにparamsを渡したときに、勝手にDateにしてくれない。
なんでDateにして欲しいかというと、
hiddenじゃないときは、"birth_date(1i)"=>"2018", "birth_date(2i)"=>"5", "birth_date(3i)"=>"24"
の形式でパラメータが渡って、モデル.newにparamsを渡したときに、Dateになっているためそのままsaveできるが、
birth_date"=>"{1=>2018, 2=>5, 3=>24}
の形式で渡ってきてしまうと、自分でDate型に整形して値をセットする必要が出てきてしまうから。
そういうときは、discard_year: true, discard_month: true, discard_day: true
のoptionをつければよかった。
<%= form_for(@user, url: { action: 'create' }) do |form| %>
<%# 省略 %>
<div>
<%= t '.birth_date' %>: <%= @user.birth_date %>
<%= form.date_select :birth_date, id: :user_date, discard_year: true, discard_month: true, discard_day: true %>
</div>
<%# 省略 %>
<% end %>
参考:
https://apidock.com/rails/ActionView/Helpers/DateHelper/date_select