0

次のカスタム検証があります。

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).lastnilを返すため、time_trackerはTimeTracker.newの値を取得します。したがって、検証は失敗します。保存されますが、コンソールで。

4

1 に答える 1

1

サーバーと同じ環境で Rails コンソールを実行していますか? たとえば、サーバーが運用モードで実行されていて、コンソールが開発モードで実行されている場合、別のデータベースにクエリを実行している可能性があります。その後TimeTracker.find_all_by_activity_id、異なる結果が返されます。

于 2012-09-24T18:39:55.290 に答える