验证在浏览器中有效,但在控制台中不起作用。为什么?

时间:2012-09-24 15:50:17

标签: ruby-on-rails ruby validation console rails-console

我有以下自定义验证:

应用/验证/ 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的值。所以验证失败了。在控制台中虽然它被保存了。

1 个答案:

答案 0 :(得分:1)

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