2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

time_fieldにバリデーションを指定する方法

Last updated at Posted at 2020-10-08

経緯

railsでフォームを実装する際にtime_fieldを使って営業時間を登録しようとしたがバリデーションがうまくいかず苦戦したため、記録として残しておく。

解決方法

自分がハマった順序を残しておくため3段回に分けて記述をしていく。
1.オプションなしで時間選択ボックスを生成する

    <div class="time-field">
      <%= f.time_select :open_time %> 〜
      <%= f.time_select :close_time %>
    </div>

204b83a9e02c5af89386534b8d0aeac4.png
現在の時刻がそのまま表示されるため、設定を忘れていたとしてもバリデーションは通過してしまう。

2. オプションとしてprompt: trueを加える

    <div class="time-field">
      <%= f.time_select :open_time, prompt: true %> 〜
      <%= f.time_select :close_time, prompt: true %>
    </div>

be7a44a3360206f251ae9e27117a9c94 (1).png
これで時刻を選択をしていなければバリデーションで弾かれてエラーが表示されるはず!と思ったが、エラー表示はされない。

3. ignore_date: true を加える

時間を指定していないはずなのにバリデーションでなぜ弾かれないのかというと年月日の情報も送られているためである。createアクションを実行した時のパラメーターを確認すると以下のようになっている

コンソール
"open_time(1i)"=>"1", "open_time(2i)"=>"1", "open_time(3i)"=>"1", "open_time(4i)"=>"", "open_time(5i)"=>""

前半の"open_time(1i)"=>"1", "open_time(2i)"=>"1", "open_time(3i)"=>"1"が年、月、日のデータで、入力していない場合は"1"という値が入って送られてしまうため、バリデーションは通過できてしまう

この事態を回避するためにignore_dateオプションをつける
ignore_date: trueとすることで未入力の場合は送信されず、時刻のみで判定をしてくれる。

コンソール
"open_time(4i)"=>"", "open_time(5i)"=>"", "close_time(4i)"=>"", "close_time(5i)"=>""

年月日の部分はパラメータに含まれずに無事エラーメッセージを表示することができた。

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?