【问题标题】:How to validate (and handle) if value passed to .to_date is valid or returns error?如果传递给 .to_date 的值有效或返回错误,如何验证(和处理)?
【发布时间】:2014-11-18 02:11:59
【问题描述】:

如果用户插入了 to_date 方法不接受的值,例如“一些胡言乱语”,它返回:

“ArgumentError:无效日期”

我如何构建一个自定义验证来向用户返回验证消息并且不会停止应用程序?

我在想重用来自another answer 的代码是个好主意,但我不知道如何将它应用到to_date。

validate do
  self.errors[:start] << "must be a valid date" unless DateTime.parse(self.start) rescue false  
end

【问题讨论】:

    标签: ruby-on-rails validation date ruby-on-rails-4 error-handling


    【解决方案1】:

    可以通过rescue来实现,然后添加到errors

    class Post < ActiveRecord::Base
    
      validate do |post|
        begin
          Date.parse(post.date)
        rescue ArgumentError
          errors.add(:date, "must be a valid date")
        end
      end
    
    ## Another way
    
      validate do |post|
        # make sure that `date` field in your database is type of `date`
        errors.add(:date, "must be a valid date") unless post.date.try(to_date) 
      end
    end
    

    【讨论】:

    • 我正在尝试从您的代码中创建一个自定义验证方法,但我一无所获.. :/
    • 我似乎做错了什么。使用第二种解决方案,我收到“NameError:未定义的局部变量或方法”,第一种:“TypeError:没有将 nil 隐式转换为字符串”。但是你的建议看起来是正确的,所以我会尝试更多地研究我的代码。
    • 说真的,如果你哪天路过斯德哥尔摩,我欠你一顿晚餐!非常感谢。
    • @Numbers heh ;) 对我来说太冷了,无论如何感谢您的酷提议。 :)
    【解决方案2】:

    而不是编写自己的验证(并且必须为它编写测试!)我建议validates_timeliness gem

    使用起来很简单

      validates_date :attribute_name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 2014-12-22
      • 2016-06-25
      • 1970-01-01
      • 2013-01-23
      • 2020-05-14
      • 1970-01-01
      • 2012-10-11
      相关资源
      最近更新 更多