概要
ビューヘルパーのdateやtimeの値をparamsから受け取ると次のようになっているため少し面倒だったという内容です。
合わせてこれをデータベースに格納したときのデータについても触れています。
<select id="log_date_1i" name="log[date(1i)]"> # 年
<select id="log_date_2i" name="log[date(2i)]"> # 月
<select id="log_date_3i" name="log[date(3i)]"> # 日
<select id="log_date_4i" name="log[date(4i)]"> # 時
<select id="log_date_5i" name="log[date(5i)]"> # 分
データの取り出し方
dateやtimeは次のように一つを指定しないと取り出すことができません。
パラメーター名に[:date]のように指定してしまうとnilが返ってきます。
通常
params[:パラメーター名]
params[:モデル名][:パラメーター名]
datetime
params["date(1i)"]
params[:モデル名]["date(1i)"]
パラメーター
どのヘルパーでも1i~5iまで値が入ってパラメーターに入っています。
その影響でtimeは時間だけしか入力していなくても次のような値になってしまいます。
dateが年月日だけなのはよく分からないのですが...
これはアクティブレコードの問題らしいですが詳しくはわかりませんでした。
現在時刻をそのまま入れた場合:
# datetime
Wed, 27 May 2020 08:04:50 JST +09:00
# date
Wed, 27 May 2020
# time
Mon, 01 Jan 0001 08:04:50 LMT +09:18
データベースへの格納と表示
時間の場合time型を指定していれば先述のパラメーターの状態でもカラムに「08:04:50」だけが格納されていました。
しかし、そのまま取り出すと「Mon, 01 Jan 0001 08:04:50 LMT +09:18」の形で表示されてしまいます。
なのでフォーマットの必要が出てくるのですが、私は次のようにしています。
localeの設定が事前に必要になりますがここでは省略します。
参考の記事ではメソッドを定義しているので場合によって使い分けられればいいですね。
time:
am: 午前
formats:
default: "%Y年%m月%d日(%a) %H時%M分%S秒 %z"
long: "%Y/%m/%d %H:%M"
short: "%m/%d %H:%M"
only_time: "%H:%M"
pm: 午後
<dd><%= l @form.time, format: :only_time %></dd>