Posted at

form_forでdate_selectをhiddenにしたい場合

More than 1 year has passed since last update.

フォームで、date_selectのinputをhiddenにしたいシチュエーションがある。

(例えば、登録(new)->確認(confirm)->(create)->完了(complete)となる画面の確認画面など)

このときに、hidden_filedにしてしまうと、


confirm.html.erb

<%= 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をつければよかった。


confirm.html.erb

<%= 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