我有以下自定义验证:
应用/验证/ 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的值。所以验证失败了。在控制台中虽然它被保存了。
答案 0 :(得分:1)
您确定在与服务器相同的环境下运行Rails控制台吗?例如,如果您的服务器在生产模式下运行,但控制台在开发中运行,则可能是在查询不同的数据库。然后TimeTracker.find_all_by_activity_id
会返回不同的结果。