※2025/8/10 最新補足
date_selectの代役として「text_field」を使用するという記事ですが、少々勘違いをしておりました。
具体的には使えないのは「select」の部分であり「date」や「time」そして「datetime」自体は問題ありません。
つまりわざわざtextで文字列にする必要はなく「date_field」や「time_field」にすれば良いです。
加えてtextにしないでdateやtimeを使った方がカレンダー方式などのネイティブ時間ピッカーも使えるのでユーザー目線かなり扱いやすいです。
↓↓以下本文↓↓
Rails 8 でフォームに日付を入力させようとするとき、よく使われるのが date_select です。しかし、環境によっては以下のようなエラーに遭遇することがあります。
🔥 発生したエラー
NoMethodError - undefined method `year' for nil:NilClass
form_with や form_for で以下のように書いた時に発生:
<%= form.date_select :birthday %>
🛠 解決策
date_select を使わず、text_field に書き換えて以下のように指定しましょう。
<%= form.text_field :birthday, type: :date %>
これで HTML5 の日付入力 UI が使えるようになりますし、モダンなブラウザではカレンダーUIも自動で表示されます。
なぜ date_select がエラーになるのか?
Rails では以前から date_select を使って日付入力フォームを構築していましたが、Rails 8 では以下のような理由でうまく動かないケースがあります。
🔍 原因:ブラウザ上では日付入力UI(カレンダーピッカーなど)を表示できますが、Rails側では値は文字列(String)として送信されてしまっているためと思われます。(本来はdate型で送りたい)
✅ なぜ text_field がオススメなのか?
・HTML5 の仕様に沿っているため、ブラウザでのサポートが強い
・シンプルなコードで実装できる
・date_select のような複数の select タグを必要としない
・JavaScript やスタイルのカスタマイズもしやすい
📌 まとめ
date_select
→古くからあるけど、最近の Rails やブラウザではエラーが出ることも
text_field + type: :date
→モダンでシンプル。今後はこちらが主流になっていく
おわりに
Rails 8 以降では text_field による日付入力が安心&便利なので、今後はこちらを使っていくのがオススメです!
普段の勉強記録や日々の学びはこちらのはてなブログで投稿しています。
技術の基礎から実践まで、わかりやすくまとめているのでぜひチェックしてみてください!
▶︎はてなブログ:育児パパエンジニアの勉強記録
https://taaa-0991.hatenablog.com/
ご質問・ご指摘があれば、コメントやXでお気軽にどうぞ!
👉[@taaa_099]( https://x.com/taaa_099 )