0

我有以下自定义验证:

应用程序/验证器/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]

如果我从一个新的数据库开始。尝试保存一个 TimeTracker 对象,该对象仅具有:clock_out属性值,而不是:clock_in浏览器和其他任何地方的属性值,但控制台失败,因为它没有通过验证。TimeTracker.find_all_by_activity_id(record.activity_id).last返回 nil,因此 time_tracker 获取 TimeTracker.new 的值。所以验证失败。在控制台中虽然它被保存了。

4

1 回答 1

1

您确定您在与服务器相同的环境下运行 Rails 控制台吗?例如,如果您的服务器在生产模式下运行,但控制台在开发中运行,则它们可能正在查询不同的数据库。然后TimeTracker.find_all_by_activity_id会返回不同的结果。

于 2012-09-24T18:39:55.290 回答