【问题标题】:Validation works in the browser but doesn't work in the console. Why?验证在浏览器中有效,但在控制台中无效。为什么?
【发布时间】:2012-09-16 02:52:06
【问题描述】:

我有以下自定义验证:

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]

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我在开发环境中。 TimeTracker.all 给了我相同的数据。当我使用 RSpec 进行测试时,它也可以工作。验证在任何地方都可以正常工作,但在控制台中......现在它根本不会伤害我我只是不明白为什么会发生这种情况,我希望它不会影响应用程序。我将更新一个不起作用的示例。
    • 我相信该对象正在通过验证,因为我没有重新加载控制台:|我只是再次尝试,验证不再通过。我真的虽然我重新加载了控制台。感谢您的意见!
    猜你喜欢
    • 2017-07-13
    • 2021-12-18
    • 1970-01-01
    • 2019-09-28
    • 2019-11-27
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多