スケジュールの作成アプリで日付を入力する際、終了日が開始日よりも前の日だった場合はバリデーションを
通さないようにする為に自作で:end_date_is_before_start_dateというメソッドを作成しました。
また、:end_date_is_before_start_dateに対するテストを先に書き、
それに対しては成功しているのですが、
以前作成した、開始日(start_date)と終了日(end_date)に値が入力されているかのテストでエラーが起きるようになりました。
エラーを見た感じnilに対して"<"を呼び出していることでエラーが起きているようです。
start_dateとend_dateはどちらもDate型で定義しています。
なぜこのようなエラーが起こるのでしょうか?
また、自作でバリデーションを作成する際には
errors.add(:end_date_is_before_start_date,"終了日は今日以降の日付で選択してください")
のようにerrors.addをしなければできないのでしょうか?
なぜif文の条件分岐で場合分けをしてreturnとfalseを返すだけではうまくいかないのでしょうか?
<エラー内容>
1) Error: ScheduleTest#test_end_date_should_be_present: NoMethodError: undefined method `<' for nil:NilClass app/models/schedule.rb:11:in `end_date_is_before_start_date' test/models/schedule_test.rb:24:in `block in <class:ScheduleTest>' 2) Error: ScheduleTest#test_start_date_should_be_present: ArgumentError: comparison of Date with nil failed app/models/schedule.rb:11:in `<' app/models/schedule.rb:11:in `end_date_is_before_start_date' test/models/schedule_test.rb:19:in `block in <class:ScheduleTest>' 10 runs, 9 assertions, 0 failures, 2 errors, 0 skips
<テスト>
test "start_date should be present" do @schedule.start_date = " " assert_not @schedule.valid? end test "end_date should be present" do @schedule.end_date = " " assert_not @schedule.valid? end test "start_date should be before end_date" do @schedule.end_date = Date.new(2021,10,13) assert_not @schedule.valid? end
<モデル>
class Schedule < ApplicationRecord validates :title, presence: true, length: {maximum: 50} validates :start_date, presence: true validates :end_date, presence:true validates :all_day, inclusion: {in: [true, false]} validates :memo, length: {maximum: 100} validate :end_date_is_before_start_date def end_date_is_before_start_date return false if end_date.blank? && start_date.blank? if end_date < start_date errors.add(:end_date_is_before_start_date,"終了日は今日以降の日付で選択してください") end end end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/22 07:52
2021/10/22 14:58
2021/10/22 19:21