2009-08-25 176 views
3

我简单的日期验证的正则表达式无法正常工作......验证日期格式在轨

validates_format_of :dob, :with => /\d{2}\/\d{2}\/\d{4}/, :message => "^Date must be in the following format: mm/dd/yyyy" 

缺少什么我在这里?我试图验证日期格式如下:mm/dd/yyyy - 当我输入什么应该是有效数据时,仍然收到错误消息。

感谢您的帮助。下面是从我的形式被传递DOB值的代码片段:

<tr>   
     <td> 
     <%= f.label :dob, "Date of Birth: " %> 
     </td> 
     <td> 
     <%= calendar_date_select_tag "user[dob]", "", :format => :american, :year_range => 50.years.ago..0.years.ago %> 
     </td> 
    </tr> 

我认为它可能有一些与我使用这个js日历插件。一个相关的问题是,如果帖子未通过验证,我的dob值不会保留 - 先前输入的日期值会清除出来...

谢谢!

汤姆

回答

3

我不是一个Rails应用程序中测试你的代码,但是你的正则表达式对我来说很好。试试这个测试程序:

#!/usr/bin/ruby 

str = '08/24/2009' 
regex = /\d{2}\/\d{2}\/\d{4}/ 

if str =~ regex 
    print 'matched', "\n" 
else 
    print 'did not match', "\n" 
end 

你的正则表达式匹配。这表明问题在别处。

您也可以考虑尝试更一般的Ruby解析日期解决方案,例如Date类的Date.parse method。这比正则表达式有更多的验证,并且它还提供了一些有用的方法来在不同格式之间转换日期。

+1

您的链接在Date.parse中被打破。这是日期类的[解析的新链接](http://ruby-doc.org/stdlib-2.0.0/libdoc/date/rdoc/Date.html#method-c-_parse)函数,但它特别声明其功能不是验证格式。 – Matt 2013-12-03 15:52:55

1

正则表达式对我来说是正确的。有用的资源是http://www.rubyxp.com/,它将根据给定的字符串测试您的正则表达式。确实,你所匹配的正则表达式匹配了我输入rubyxp的日期。

也许在获取输入数据时存在一个问题 - 这个字段真的叫做da吗?

你可能会发现有用的另一个项目:validates_timeliness,一个rails插件来验证日期和时间。为什么只是验证日期格式,当你可以检查它是否是一个真正的日期 - 毕竟99/99/9999会验证你的正则表达式,但你可能并不真的想接受。

0

您可能还想看看进行自然日期分析的Chronic Gem(http://chronic.rubyforge.org/)。晚上9点

下周二它将正确地解释它:所以,你可以进去。

6

您可能正在使用字符串字段来存储日期。因此,期望DateTime或Time值的任何助手将无法正常工作。您将需要调查Rails中的多参数分配以找出正确的方法来执行您想做的事情(multiparemeter分配是将4个字段发送到Rails并将它们转换为DateTimeTime对象的魔法。

换句话说:如果您使用的是真正的日期时间字段(如你应该为这种情况下)的validates_format_of不会有任何影响(或会产生不利影响)

+0

+1肯定听起来像我应该看的东西 - 谢谢! – cakeforcerberus 2009-08-25 14:03:50

2

唉唉!当Rails隐式转换它们时,在最终用户上强制使用日期格式对于可用性来说是一件坏事,同时为您提供更多的工作(如您所见)。

如果你已经在你的模型有一个日期/时间属性,Rails会尽力通过Date.Parse转换(http://www.ruby-doc.org/core/classes/Date.html#M000644),例如

u = Somemodel.find :first 

u.created_at 
=> Tue Nov 20 15:44:18 -0500 2007 

u.created_at = '2008/07/03' 
=> "2008/07/03" 

u.created_at 
=> Thu Jul 03 00:00:00 -0400 2008 

u.created_at = '05/10/1980' 
=> "05/10/1980" 

u.created_at 
=> Sat May 10 00:00:00 -0400 1980 
+0

你当然是对的。我没有意识到,Rails在后台做了一些神奇的事情来解析用户的输入(我猜想我的日常工作是用C#编程的一个副作用:)) - 我很确定我将它作为一个字符串存储在那么我只需将它切换到日期并删除validates_format_of即可。谢谢:) +1 – cakeforcerberus 2009-08-25 20:46:29

+0

@Matt Rogish如果你只是想验证字符串是一个日期而不考虑日期格式? – Mohamad 2013-04-25 17:47:40

1

您可以尝试使用当前的日期将其转换成一个格式像他:

高清validate_date_format(值)

current_date = DateTime.now 
begin 
    DateTime.strptime(current_date, value) 
rescue 
    raise 'Invalid Format' 
end