2011-04-14 85 views
7

我有一个Active Record模型,它包含两个属性:start_date和end_date。我如何去确认以下内容:Rails中的日期验证

  1. 日期是在正确的(YYYY-MM-DD)格式
  2. 这end_date之间>起始日期

回答

1

这里是如何做到日期验证:

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 
21

无论是否它们存储在什么格式? 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 

请记住,这不检查零日期......你可能想如果任何可能。如果您希望能够接受多种格式,Chronic非常灵活。

+0

好,我填充我的“为MyModel”对象在与下面的代码行的控制器动作: 为MyModel = MyModel.new(PARAMS [:为MyModel]) 我猜测,是设置起始日期和end_date作为字符串。我想我可以手动将params [:start_date]和params [:end_date]转换为日期对象,然后将它们存储在我的模型中。那是你会推荐的吗? (是的,我将它们存储在数据库中的日期列中) – 2011-04-14 16:30:45

+1

您可以将日期作为字符串传递给参数散列而没有任何问题......它们将自动转换为Date对象。但有一点警告:如果你像01-04-1990那样传递一个字符串,它不会被解释为1990年1月4日,而是1990年4月1日。然而,YYYY-MM-DD是明确的并且将被解析正确。 – brettish 2011-04-14 22:22:29

+0

谢谢。是的,我遇到了mm/dd/yyyy与dd/mm/yyyy问题。我决定只需要输入yyyy-mm-dd格式的用户输入。 – 2011-04-14 22:32:40