datetime形式の入力を厳密にチェックしたい場合
datetime形式のパラメータは params[:hoge][:date(1i)], params[:hoge][:date(2i)], params[:hoge][:date(3i)] のように分かれてくる。このパラメータをmass assignmentでdatetime形式のカラムの属性に代入すると、railsが気を利かせて解釈してくれてDateTimeクラスのオブジェクトに変換してくれる。でも2月30日みたいな日付も気を利かせて3月2日とかに変換しちゃう。これはいまいち。
これを"きちんと"エラーにするにはわりと面倒で下記のようにするのがとりあえずいいのかなーと思っている。
- モデルに、datetime型のカラムのエラー状態を保持するインスタンス変数を定義する
- paramsを属性に代入する段階で数値のチェック。エラーならインスタンス変数を更新。
- validateメソッドを定義して、インスタンス変数をチェックしてエラーならerrors.add
- エラー時に入力値を保持して表示させるために、フォームのselectタグは、paramsの値を見てchecked属性を設定する。
正直とても面倒なのでこういうことをよくするのならgem作った方が良いのかもしれない