2009-08-25 2 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. Когда я вводим то, что должно быть достоверным, я все равно получаю сообщение об ошибке.

Спасибо за помощь. Вот фрагмент кода из моей формы, который проходит значение Добролюбова в:

<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.parse method класса Date. Это делает немного более достоверным, чем ваше регулярное выражение, а также предоставляет некоторые полезные методы для преобразования дат между различными форматами.

+1

Ваша ссылка нарушена для Date.parse. Ниже приведена [новая ссылка на синтаксический анализ] (http://ruby-doc.org/stdlib-2.0.0/libdoc/date/rdoc/Date.html#method-c-_parse) для класса даты, но он конкретно заявляет, что его функция заключается не в подтверждении формата. – Matt

1

Регулярное выражение выглядит правильно для меня. Полезным ресурсом является http://www.rubyxp.com/, который проверяет ваше регулярное выражение на заданную строку. Действительно, в регулярном выражении у вас есть дата, которую я ввел в rubyxp.

Возможно, есть проблема с получением введенных данных - возможно, поле действительно называется да?

Другой предмет, который может вам пригодиться: validates_timeliness, плагин rails для проверки дат и времени. Зачем просто проверять формат даты, когда вы можете проверить, действительно ли это реальная дата. В конце концов, 99/99/9999 будет проверять ваше регулярное выражение, но вы действительно не можете этого принять.

0

Возможно, вы также захотите изучить Хронический драгоценный камень (http://chronic.rubyforge.org/), который выполняет естественный синтаксический анализ даты. Таким образом, вы можете войти в систему:

Следующая вторник в 9 вечера

И он будет интерпретировать его правильно.

6

Возможно, вы используете строковое поле для хранения даты. Следовательно, любые помощники, ожидающие значения DateTime или Time, не будут работать должным образом. Вам нужно будет исследовать многоадресные задания в Rails, чтобы выяснить правильный способ делать то, что вы хотите сделать (назначение многоадресных вычислений - это волшебство посылки 4 полей в Rails и преобразование их в объект DateTime или Time).

Другими словами: если вы используете истинное поле DateTime (как вы должны для этого случае) validates_format_of не будет иметь никакого эффекта (или будет иметь неблагоприятные последствия)

+0

+1 Определенно звучит как-то, на что я должен смотреть - спасибо! – cakeforcerberus

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

+0

@Matt Rogish Что делать, если вы просто хотите подтвердить, что строка является датой без учета формата даты? – Mohamad

1

Вы можете попробовать использовать текущую дату, чтобы преобразовать его в формат что-то вроде его:

Защиту validate_date_format (значение)

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

конец

Смежные вопросы