Проверка форматов даты в рельсах - PullRequest
3 голосов
/ 25 августа 2009

Мое простое регулярное выражение проверки даты не работает правильно ...

validates_format_of :dob, :with => /\d{2}\/\d{2}\/\d{4}/, :message => "^Date must be in the following format: 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 calendar. Связанная проблема заключается в том, что мое значение dob не сохраняется в поле, если сообщение не проходит проверку - ранее введенное значение даты очищается ...

Спасибо!

Tom

Ответы [ 7 ]

6 голосов
/ 25 августа 2009

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

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

4 голосов
/ 25 сентября 2009

Найден отличный гем / плагин для всех ваших проверок даты / времени.

validates_timeliness

http://github.com/adzap/validates_timeliness

3 голосов
/ 25 августа 2009

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

2 голосов
/ 25 августа 2009

Ааа! Принудительное использование форматов даты для конечного пользователя, когда 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
1 голос
/ 19 декабря 2014

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

def validate_date_format(value)
    current_date = DateTime.now
    begin
      DateTime.strptime(current_date, value)
    rescue
      raise 'Invalid Format'
    end
 end
1 голос
/ 25 августа 2009

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

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

Еще один пункт, который вам может пригодиться: validates_timeliness , плагин для проверки даты и времени. Зачем просто проверять формат даты, когда вы можете проверить, является ли она реальной датой - в конце концов, 99/99/9999 будет проверяться на соответствие вашему регулярному выражению, но вы, возможно, не хотите принимать это.

0 голосов
/ 25 августа 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...