質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

1回答

1039閲覧

DBへの保存の時はかからなかったバリデーションが更新時にかかる

miSaito

総合スコア16

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

0クリップ

投稿2020/06/03 04:29

編集2020/06/03 05:47

前提・実現したいこと

現在、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が過去の時間と判定されてしまうのは納得ができました。

日付を除いて時間のみを送信する方法がありましたら教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

日付を除いて時間のみで比較してはどうでしょう
Time.current.strftime('%H%M") とか
Time.current.to_i % (3600*24) とか

投稿2020/06/03 08:10

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問