【问题标题】:Rails 4.0 Custom Validator Not WorkingRails 4.0 自定义验证器不工作
【发布时间】:2013-11-23 18:38:46
【问题描述】:

我正在尝试验证 Rails 4 应用程序中的某些日期,但它不起作用。

我查看了许多类似的代码示例,例如 Same custom validation for several fields in Railshttp://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 }

错误是(我认为)故意的,我输入了“2012 年 1 月 123 日”的日期,但验证器没有发现它。好吧,实际上我删除了所有验证代码并让(我认为)验证器写入日志,因为验证器似乎甚至没有运行,至少,日志中没有任何内容显示它运行。

我知道正在找到验证器代码,因为在模型中,如果我稍微更改验证名称,我会收到无法找到验证的错误。

我敢肯定,这是一个非常愚蠢的菜鸟问题,感谢您的耐心。

谢谢。

【问题讨论】:

    标签: ruby-on-rails-4 customvalidator


    【解决方案1】:

    在你的验证器运行之前它确实失败了——当你在一个不存在的日期调用Time.parse 时会发生“参数超出范围”错误。在 irb 中:

    2.0.0p247 :004 > require 'time'
    => true
    2.0.0p247 :005 > Time.parse("1/123/2012")
    ArgumentError: argument out of range
    

    我打赌starteddatetimetimestamp 属性,对吧? Rails 尝试在运行任何验证之前将字符串从 params 哈希转换为它们的类型。

    【讨论】:

    • 谢谢卡罗尔,还没有检查,但你说的似乎很准确。我想我必须做更多的研究才能完成验证。也许不将值作为属性,而将其作为字符串,看看我是否可以解析它?好像很别扭有没有更简单的方法?是切换到 Rails 4 的问题吗?在 Rails 3 中似乎有很好的日期验证器,但在 Rails 4 中则更少?
    • 您真正想要解决的问题是什么?如果您试图阻止某人输入无效日期,那么类型转换不是这样做的吗?你想让人们输入像“1/123/2012”这样的东西吗?如果你这样做了,那么它真的是你想要用于该属性类型的日期吗?
    • 谢谢卡罗尔。我试图投票给你的 cmets,但我没有代表这样做。无论如何,我要做的就是在 Rails 4 中验证日期时间,我一定遗漏了一些东西,因为它看起来一点也不简单。我似乎无法捕捉到类型转换导致的异常,它在我的验证器启动之前就消失了。我是否会在控制器中陷入编辑操作?
    • 我反复看过这个,但我无法让它工作。我的菜鸟技能不足。也就是说,我认为真正的问题是这里描述的问题:github.com/rails/rails/pull/11867
    • 显然该错误正在处理中(请参阅链接),但我必须遗漏一些东西,因为要获得在 Rails 4 中捕获“2/31/2014”的日期验证,我必须求助于javascript。我错过了什么?
    猜你喜欢
    • 2011-09-04
    • 2012-04-20
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多