我有以下自定义验证:
应用程序/验证器/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 的值。所以验证失败。在控制台中虽然它被保存了。