【问题标题】:Date validation in RailsRails 中的日期验证
【发布时间】:2011-08-05 15:05:09
【问题描述】:

我有一个包含两个属性的 Active Record 模型:start_date 和 end_date。如何验证以下内容:

  1. 日期格式正确 (yyyy-mm-dd)
  2. 那个 end_date > start_date

【问题讨论】:

    标签: ruby-on-rails validation activerecord


    【解决方案1】:

    它们以什么格式存储有关系吗? Date 对象是一个 Date 对象。您是否将其存储在数据库的日期列中?

    这是我进行验证的方式:

    class MyModel < ActiveRecord::Base
      validate :validate_end_date_before_start_date
    
      def validate_end_date_before_start_date
        if end_date && start_date
          errors.add(:end_date, "Put error text here") if end_date < start_date
        end
      end
    end
    

    请记住,这不会检查 nil 日期...如果可以,您可能会想要。

    仅供参考,如果您希望能够接受各种格式,Chronic 非常灵活。

    【讨论】:

    • 好吧,我在控制器操作中填充了我的“MyModel”对象,其中包含以下代码行: mymodel = MyModel.new(params[:mymodel]) 我猜这是设置start_date 和 end_date 作为字符串。我想我可以先手动将 params[:start_date] 和 params[:end_date] 转换为日期对象,然后再将它们存储在我的模型中。那是你推荐的吗? (是的,我将它们存储在数据库的日期列中)
    • 您可以将日期作为字符串传递给参数哈希,而不会出现任何问题......它们将自动转换为 Date 对象。但是有一点警告:如果你传入一个像 01-04-1990 这样的字符串,它不会被解释为 1990 年 1 月 4 日,而是 1990 年 4 月 1 日。但是,YYYY-MM-DD 是明确的并且会被解析正确。
    • 谢谢。是的,我遇到了 mm/dd/yyyy vs dd/mm/yyyy 问题。我决定只要求用户输入 yyyy-mm-dd 格式。
    • @kevin 我使用慢性 gem 的原因之一是(除其他外)解析 mm/dd/yyyy。我使用慢性覆盖了我的 end_date 设置器。
    • 上面的答案有问题。 validates 后面的“s”会导致崩溃。我花了 30 分钟才弄明白。正确形式:'validate :validate_end_date_before_start_date'
    【解决方案2】:

    以下是如何进行日期验证:

    How do I validate a date in rails?

    查看一个日期是否大于另一个日期,您可以在日期对象上使用大于/小于运算符:

    ruby-1.9.2-p136 :006 > d1 = Date.civil(2011, 05, 01)
     => #<Date: 2011-05-01 (4911365/2,0,2299161)> 
    ruby-1.9.2-p136 :007 > d2 = Date.civil(2011, 01, 01)
     => #<Date: 2011-01-01 (4911125/2,0,2299161)> 
    ruby-1.9.2-p136 :008 > d2 > d1
     => false 
    ruby-1.9.2-p136 :009 > d2 < d1
     => true 
    

    所以在你的例子中:

    def validate_dates
      errors.add("Created at date", "is invalid.") unless convert_created_at
      errors.add("End Date" , "is invalid") if end_date > start_date
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2010-11-22
      • 2010-10-10
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多