我正在尝试验证Rails 4应用程序中的某些日期,但它无效。
我查看了许多类似的代码示例,例如Same custom validation for several fields in Rails和此http://railscasts.com/episodes/211-validations-in-rails-3。 (和其他更复杂的)。我不明白为什么我的例子不起作用。试图找到问题,我已经删除了实际的验证代码,并留下了一个存根,因为验证似乎没有运行,这似乎是基本问题(或至少是第一个问题)。
以下是验证器中的代码(位于app / validators / custom_date_validator.rb
中)class CustomDateValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
puts "Custom validator was called"
record.errors[attribute] << "Date Not Valid" unless false
end
end
以下是模型中的代码:
class CaseInformation < ActiveRecord::Base
include ApplicationHelper
validates :started, :custom_date => true
错误消息是:
argument out of range
Extracted source (around line #104):
respond_to do |format|
104 if ( @case_information.update_attributes(params[:case_information]) && @case_information.update_attributes(params[:law_guardians]) )
format.html { redirect_to @case_information, notice: 'Case information was successfully updated.' }
format.json { head :no_content }
错误是(我认为)故意的,我输入了“1/123/2012”的日期,但验证器没有抓住它。嗯,其实我去掉了所有的验证码,并有(我认为)验证写入日志,因为它似乎并没有验证甚至运行,至少,没有什么显示它运行在日志中。
我知道正在找到验证器代码,因为在模型中,如果我更改了验证名称,我会收到一个无法找到验证的错误。
真的很愚蠢的菜鸟问题我相信,你的耐心是值得赞赏的。
感谢。
答案 0 :(得分:0)
在你的验证器运行之前确实失败了 - “参数超出范围”错误是当你在一个不存在的日期调用Time.parse
时会发生的错误。在irb:
2.0.0p247 :004 > require 'time'
=> true
2.0.0p247 :005 > Time.parse("1/123/2012")
ArgumentError: argument out of range
我认为started
属于datetime
或timestamp
属性,对吗?在运行任何验证之前,Rails会尝试将字符串从params
哈希转换为其类型。