Ruby on rails 4 Rails 4.0自定义验证程序不工作

Ruby on rails 4 Rails 4.0自定义验证程序不工作,ruby-on-rails-4,customvalidator,Ruby On Rails 4,Customvalidator,我正在尝试验证Rails4应用程序中的一些日期,但它不起作用 我看了很多类似的代码示例,比如这个和这个。(还有一些更复杂)。我不明白为什么我的例子不起作用。为了找到问题,我剥离了实际的验证代码,并留下了一个存根,因为验证似乎没有运行,这似乎是基本问题(或者至少是第一个问题) 下面是验证器中的代码(位于app/validators/custom\u date\u validator.rb中 class CustomDateValidator < ActiveModel::EachValida

我正在尝试验证Rails4应用程序中的一些日期,但它不起作用

我看了很多类似的代码示例,比如这个和这个。(还有一些更复杂)。我不明白为什么我的例子不起作用。为了找到问题,我剥离了实际的验证代码,并留下了一个存根,因为验证似乎没有运行,这似乎是基本问题(或者至少是第一个问题)

下面是验证器中的代码(位于app/validators/custom\u date\u 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
这个错误(我认为)是故意的,我输入了一个日期“1/123/2012”,但验证器没有捕捉到它。事实上,我去掉了所有的验证代码,让验证器(我认为)写入日志,因为验证器似乎没有运行,至少日志中没有显示它运行过

我知道正在找到验证程序代码,因为在模型中,如果我稍微更改验证名称,就会出现无法找到验证的错误

我相信你的耐心是值得的


谢谢。

在您的验证器运行之前确实失败了——“参数超出范围”错误是您调用
时间时发生的错误。在不存在的日期解析
。在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
散列中的字符串转换为它们的类型。

谢谢Carol,还没有检查,但您所说的似乎非常正确。我想我必须做更多的研究完成验证。也许把值作为字符串而不是属性,看看我能不能解析它?看起来很尴尬。有没有更简单的方法?切换到Rails 4是不是问题所在?Rails 3中似乎有很好的日期验证器,但Rails 4中却没有那么好的日期验证器?你真正想解决的问题是什么?如果你试图阻止某人输入无效日期,类型转换不是这样做的吗?是否允许人们输入“1/123/2012”之类的内容?如果你这样做了,那么这真的是你想要用于该属性类型的日期吗?谢谢Carol。我试图投票支持你的评论,但我没有代表这样做。无论如何,我所要做的就是验证Rails 4中的日期时间,我一定遗漏了一些东西,因为它看起来一点也不直接。我似乎无法捕捉到异常类型转换导致的问题,在我的验证器启动之前就消失了。我是否在控制器中绕过编辑操作?我已经反复研究了这个问题,但我无法使其工作。我的noob技能不足。也就是说,我认为真正的问题是这里描述的问题:显然正在处理该错误(请参阅链接),但我必须错过一些东西,因为要获得Rails 4中捕获“2/31/2014”的日期验证,我必须求助于javascript。我错过了什么?
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 }
2.0.0p247 :004 > require 'time'
=> true
2.0.0p247 :005 > Time.parse("1/123/2012")
ArgumentError: argument out of range