2013-09-12 4 views
5

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

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 года).

+0

I18n.l (пользователь.birthday) работает хорошо хотя. Поэтому локаль i18n должна быть правильной. – Almaron

+0

Разве это не так, как эта проблема? http://stackoverflow.com/questions/15531786/how-do-i-change-the-format-activerecord-expects-when-parsing-dates-from-a-text-f/15607550 – depa

+2

depa: не реально. Я думаю, что большая часть моей проблемы заключается в анализе имен месяцев, а самая маленькая - о самом формате. Таким образом, решения givven действительно не подходят. Я видел «делокализатор», но он все еще не поддерживает Rails 4. – Almaron

ответ

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 
Смежные вопросы