次のカスタム検証があります。
app / validators / clock_able_validator.rb
class ClockAbleValidator < ActiveModel::Validator
def validate(record)
time_tracker = time_tracker(record)
error_location = "activerecord.errors.models.activity.attributes.base"
record.errors[:clock_in_able] = I18n.t "#{error_location}.clock_in_able" if !clock_in_able?(record,time_tracker)
record.errors[:clock_out_able] = I18n.t "#{error_location}.clock_out_able" if !clock_out_able?(record,time_tracker)
end
def clock_in_able?(record,time_tracker)
return true if time_tracker.nil?
return true if !time_tracker.clock_out.nil?
return true if time_tracker.id == record.id
return false
end
def clock_out_able?(record,time_tracker)
return false if record.id == time_tracker.id and !time_tracker.clock_out.nil?
return true if !record.clock_in.nil?
return false
end
def time_tracker(record)
TimeTracker.find_all_by_activity_id(record.activity_id).last || TimeTracker.new
end
end
time_trackerは前のレコードです。前のレコードに関連する特定の条件が満たされている場合、新しいレコードが検証されます。
この検証は、ブラウザーでテストすると完全に機能します。私の質問は、コンソールでテストしたときに検証が機能しないのはなぜですか?コンソールからデータベース内の任意のレコードを保存できます。
[編集]
などの別のエラーを追加した場合record.errors[:bla] = "Why only this error works?"
。検証はコンソールにも合格しません。したがって、期待どおりに機能します。ただし、他の検証には合格しますが、合格しないはずです。
[編集2]
新しいデータベースから始めた場合。:clock_out
属性のみの値を持ち、ブラウザやその他のすべての場所の属性の値を持たないTimeTrackerオブジェクトを保存しようとしてい:clock_in
ますが、検証に合格しないため、コンソールは失敗します。TimeTracker.find_all_by_activity_id(record.activity_id).last
nilを返すため、time_trackerはTimeTracker.newの値を取得します。したがって、検証は失敗します。保存されますが、コンソールで。