前提・実現したいこと
現在、Railsでアプリを作っている者ですが、『DBへの保存の時はかからなかったバリデーションが更新時にかかる』ことに悩んでいます。
DBへの保存時はform_withでdate型のterm_dateカラムとtime型のterm_timeカラムを繋がっているように見せて別々に保存しています。
Ruby
1<div class="request-form-term-select"> 2 <%= raw sprintf(f.date_select(:term_date, class: "request-term-date-select", default: Date.current, use_month_numbers: true, start_year: (Time.current.year), end_year: (Time.current.year + 1), date_separator: '%s'),'年 ', '月 ') + '日'%> 3 <%= f.time_select :term_time, minute_step: 1, class: "request-term-time" %> 4</div>
更新時も同じ記述をしています。
バリデーションは下のように
「入力した日付(term_date)が今の日付より過去だったらエラーを出す」
「入力した日付が今の日付と同じだったらtime_pastを実行し、入力した時間(term_time)が今の時間より過去だったらエラーを出す」 というようにしています。
#model validate :pretend_ago def pretend_ago if term_date < Date.current errors.add(:term_date, 'は過去の日付は指定できません') elsif term_date == Date.current time_past else end end private def time_past if Time.current > term_time errors.add(:term_time, 'は過去の時間は指定できません') end end
このバリデーションでDBへの保存時は意図した通りにバリデーションが機能してくれるのですが、更新時には2つ目のエラーに今より先の時間を指定してもかかってしまいます。
DBへの保存時と同じようにバリデーションをかけるのはどのようにすればいいのでしょうか。
よろしくお願いいたします。
追記
更新時にbinding.pryを使ってterm_timeがどのように送られているのか確認したところ、
"term_time(1i)"=>"2000", "term_time(2i)"=>"1", "term_time(3i)"=>"1", "term_time(4i)"=>"14", "term_time(5i)"=>"58"
2000/1/1/14:58と送られていたため、今の時間(2020/06/03)と比較した時にterm_timeが過去の時間と判定されてしまうのは納得ができました。
日付を除いて時間のみを送信する方法がありましたら教えていただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。