前提
date型のカラムをvalueの引数に渡すと、to_s
されて"2021-09-06"
になる。
datetime型のカラムはActiveSupport::TimeWithZone
なので、valueの引数に渡すと、to_s
されて"2021-09-06 00:16:12 +0900"
になる。
date_field
カラムがdateのとき
1
|
= f.date_field :birthday, value: user.birthday
|
内部的にto_s
されて、user.birthday.strftime('%Y-%m-%d')
と同じになる。
1
|
<input value="2021-09-06" type="date" name="user[birthday]" id="user_birthday">
|
カラムがdatetimeのとき
1
|
= f.date_field :published_at, value: article.published_at.to_date
|
デフォルトだとvalue="2021-09-06 00:16:12 +0900"
になるので、フォームは日付として見なしてくれない。なので、to_date
で日付に変換する。

datetime_field
typeがdatetime-local
になるので、date, datetimeどちらの場合もstrftime('%Y-%m-%dT%T')
で"2021-09-06T00:16:12"
の形する必要がある(T
は文字列)。
1
|
= f.datetime_field :published_at, value: article.published_at.strftime('%Y-%m-%dT%T')
|
1
|
<input value="2021-09-06T00:16:12" type="datetime-local" name="article[published_at]" id="article_published_at">
|

time_field
time_fieldでは、時:分:秒
、時:分
どちらでもいい。
time 入力欄を含むフォームが送信されると、フォームのデータに含められる前に値がエンコードされます。 time 入力欄のフォームのデータ項目は、常にname=hh%3Amm
の形式か、秒が含まれる場合はname=hh%3Amm%3ass
の形式になります。
<input type="time"> - HTML: HyperText Markup Language | MDN
1
|
= f.time_field :published_at, value: article.published_at.strftime('%R')
|
1
|
<input value="00:16" type="time" ame="article[published_at]" id="article_published_at">
|

1
|
= f.time_field :published_at, value: article.published_at.strftime('%T')
|
1
|
<input value="00:16:12" type="time" ame="article[published_at]" id="article_published_at">
|

全体参考