date_selectで入力した日付がDBに保存されない!


date_selectとは?

生年月日を入力してもらう際、ユーザーに直接入力してもらうのではなく

選択式で入力してもらうようにしたい場合

date_selectというものを使う

.member-main__form
  = f.label '生年月日', {class: 'member-main__form--label'}
  %span.member-main__form--require 必須
  %p.member-main__form--select
    != sprintf(f.date_select(:birthday, require:true,with_css_classes:'XXXXX', prompt:"--",use_month_numbers:true, start_year:Time.now.year, end_year:1900, date_separator:'%s'),'年 ','月 ')+'日'

問題発生

実装したはいいが問題が発生した

選択した生年月日の数値がDBに保存されていないのだ

原因

色々調べた結果マイグレーションファイルに着目した

t.integer :birthday,  null: false

このデータ型のintegerが原因ではないかと考えた

integerとは整数だけを保存する型であり

date_selectで入力した数値は整数では保存されないのではと思い

以下のようにdate型にしたみた

t.date :birthday,  null: false

するとDBにしっかりと保存することができた

DBを確認

保存された内容をSequel Proで確認してみると

上のように年-月-日となって保存されており

整数以外に記号"-"が入っているのが確認できる

これではinteger型で保存できないのは当然である

まとめ

date_selectで入力させるときはDBの方はdate型で保存させるようにしよう