我有一个Active Record模型,它包含两个属性:start_date和end_date。我如何去确认以下内容:Rails中的日期验证
- 日期是在正确的(YYYY-MM-DD)格式
- 这end_date之间>起始日期
我有一个Active Record模型,它包含两个属性:start_date和end_date。我如何去确认以下内容:Rails中的日期验证
这里是如何做到日期验证:
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
无论是否它们存储在什么格式? 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非常灵活。
好,我填充我的“为MyModel”对象在与下面的代码行的控制器动作: 为MyModel = MyModel.new(PARAMS [:为MyModel]) 我猜测,是设置起始日期和end_date作为字符串。我想我可以手动将params [:start_date]和params [:end_date]转换为日期对象,然后将它们存储在我的模型中。那是你会推荐的吗? (是的,我将它们存储在数据库中的日期列中) – 2011-04-14 16:30:45
您可以将日期作为字符串传递给参数散列而没有任何问题......它们将自动转换为Date对象。但有一点警告:如果你像01-04-1990那样传递一个字符串,它不会被解释为1990年1月4日,而是1990年4月1日。然而,YYYY-MM-DD是明确的并且将被解析正确。 – brettish 2011-04-14 22:22:29
谢谢。是的,我遇到了mm/dd/yyyy与dd/mm/yyyy问题。我决定只需要输入yyyy-mm-dd格式的用户输入。 – 2011-04-14 22:32:40