在rails中验证日期格式

时间:2009-08-25 00:40:04

标签: ruby-on-rails ruby regex validation

我的简单日期验证正则表达式无法正常运行...

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值不会在字段中维护 - 之前输入的日期值会清除...

谢谢!

汤姆

7 个答案:

答案 0 :(得分:6)

您可能正在使用字符串字段来存储日期。因此,任何期望DateTime或Time值的帮助程序都将无法正常工作。您将需要调查Rails中的多参数分配以找出执行您想要执行的操作的正确方法(多参数分配是将4个字段发送到Rails并将其转换为DateTime或{{1}的魔力} object)。

换句话说:如果您使用的是真正的DateTime字段(对于这种情况应该如此),validates_format_of将不会产生任何影响(或会产生不利影响)

答案 1 :(得分:4)

为您的所有日期/时间验证找到了一个出色的宝石/插件。

<强> validates_timeliness

http://github.com/adzap/validates_timeliness

答案 2 :(得分: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。这比正则表达式更有效,它还提供了一些在不同格式之间转换日期的有用方法。

答案 3 :(得分: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

答案 4 :(得分:1)

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

在获取输入数据时可能存在问题 - 该字段实际上是否被称为da?

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

答案 5 :(得分:1)

您可以尝试使用当前日期将其转换为类似他的格式:

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

答案 6 :(得分:0)

您可能还想查看进行自然日期分析的慢性宝石(http://chronic.rubyforge.org/)。所以你可以输入:

下周二晚上9点

它会正确解释它。