Rails 4 анализирует дату на другом языке

У меня есть text_field :birthday_line в моей пользовательской форме, которую мне нужно проанализировать в атрибуте пользователя birthday. Итак, я делаю что-то подобное в своем классе User.

attr_accessor :birthday_line
before_save :set_birthday

def set_birthday
  self.birthday = Date.strptime(birthday_line, I18n.translate("date.formats.default")
end

Но проблема в том, что по какой-то причине мне выдается сообщение об ошибке Invalid date, когда я пытаюсь передать строку 27 января 1987 г., которая должна быть проанализирована до 1987-01-27. Формат и названия месяцев в моем config/locales/ru.yml

ru:
  date:
    formats:
      default: "%d %B %Y г."
    month_names: [~, января, февраля, марта, апреля, мая, июня, июля, августа, сентября, октября, ноября, декабря]

кажется правильным.

Date.parse также не помогает, он просто анализирует номер дня (27) и помещает месяц и год в текущую дату (так что это будет 27 сентября 2013 года вместо 27 января 1987 года).


person Almaron    schedule 12.09.2013    source источник
comment
Однако I18n.l(user.birthday) работает нормально. Таким образом, локаль i18n должна быть правильной.   -  person Almaron    schedule 12.09.2013
comment
Разве это не то же самое, что и эта проблема? stackoverflow.com/questions/15531786/   -  person Marcelo De Polli    schedule 12.09.2013
comment
депа: не совсем. Я думаю, что самая большая часть моей проблемы - это разбор названий месяцев, а самая маленькая - сам формат. Таким образом, данные решения действительно не подходят. Я видел гем delocalize, но он все еще не поддерживается Rails 4.   -  person Almaron    schedule 12.09.2013


Ответы (1)


У меня была такая же проблема, и что я могу предложить:

string_with_cyrillic_date = '27 Января 1987'

1) создать массив таких массивов

months = [["января", "Jan"], ["февраля", "Feb"], ["марта", "Mar"], ["апреля", "Apr"], ["мая", "May"], ["июня", "Jun"], ["июля", "Jul"], ["августа", "Aug"], ["сентября", "Sep"], ["октября", "Oct"], ["ноября", "Nov"], ["декабря", "Dec"]]

2) Теперь вы можете повторить это и найти свой кириллический месяц:

months.each do |cyrillic_month, latin_month|
  if string_with_cyrillic_date.match cyrillic_month      
    DateTime.parse string_with_cyrillic_date.gsub!(/#{cyrillic_month}/, latin_month) 
  end
end

И теперь вы получите дату, которую вы ожидаете

27 Jan 1987
person mmike    schedule 29.11.2016