Rails проверяет три типа формата даты

Я разрабатываю приложение Ruby on Rails, в котором используется особый формат даты. Рассматриваемый формат даты - год.месяц.день, и дата может быть:

Год.месяц.день Год.месяц Год

Я работаю над методом проверки, который должен проверять формат и, если дата ввода соответствует любому из этих форматов, сделать ее действительной. Пока мой код:

def data_format_correct
regexymd = /[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}/
regexym = /[0-9]{4}[.][0-9]{1,2}/
regexy = /[0-9]{4}/
if :data.to_s =~ regexymd
  return true
elsif  :data.to_s =~ regexym
  return true
elsif :data.to_s =~ regexy
  return true
else
  errors.add(:data)
  return
end

конец

Каждый раз, когда я помещаю дату в форму, возникает ошибка else case. Я почти уверен, что мой код правильный. Я что-то упускаю?

Изменить:

Решение найдено. Работает так:

regexymd = /^[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}$/
regexym = /^[0-9]{4}[.][0-9]{1,2}$/
regexy =  /^[0-9]{4}$/
regex_final = Regexp.union(regexymd, regexym)
regex_final = Regexp.union(regex_final, regexy)

validates :data, :format => { :with => regex_final }

Надеюсь, что это поможет любому в такой же ситуации, как у меня. Спасибо за ответы. Я ценю обратную связь.


person Wiggin    schedule 31.07.2012    source источник
comment
Можете ли вы пройти в исключении обратную трассировку?   -  person Andrew Nesbitt    schedule 31.07.2012


Ответы (1)


Вы не соответствуете переменной data, вы соответствуете символу :data, поэтому возникает ошибка (кстати, было бы полезно опубликовать эту ошибку).

Во всяком случае, я думаю, что вы хотите что-то вроде этого:

def data_format_correct
  regexymd = /[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}/
  regexym = /[0-9]{4}[.][0-9]{1,2}/
  regexy = /[0-9]{4}/
  if regexymd.match(data.to_s)
    return true
  elsif  regexym.match(data.to_s) 
    return true
  elsif regexy.match(data.to_s) 
    return true
  else
    errors.add(:data)
    return
  end
end
person Chris Salzberg    schedule 31.07.2012
comment
Догадаться! Я объединяю три регулярных выражения в одно, используя Regexp.join, а затем передаю результат для проверки :data, :format =› { with =› result }. Сделал трюк. Выложу решение. Спасибо за ответ кстати. Я ценю обратную связь :-D - person Wiggin; 31.07.2012