我的简单日期验证正则表达式无法正常运行...
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值不会在字段中维护 - 之前输入的日期值会清除...
谢谢!
汤姆
答案 0 :(得分:6)
您可能正在使用字符串字段来存储日期。因此,任何期望DateTime或Time值的帮助程序都将无法正常工作。您将需要调查Rails中的多参数分配以找出执行您想要执行的操作的正确方法(多参数分配是将4个字段发送到Rails并将其转换为DateTime
或{{1}的魔力} object)。
换句话说:如果您使用的是真正的DateTime字段(对于这种情况应该如此),validates_format_of将不会产生任何影响(或会产生不利影响)
答案 1 :(得分:4)
答案 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)