#ruby-on-rails #ruby #activerecord #activesupport #to-date
#ruby-on-rails #ruby #activerecord #activesupport #на сегодняшний день
Вопрос:
Приложение, с которым я работаю, настаивает на отображении всех введенных пользователем дат (через jquery datepicker) в нестандартном американском формате %m /%d /%Y. В результате у нас есть множество strptime
методов, разбросанных по нашим контроллерам.
Я пытаюсь очистить его и хотел бы перегрузить расширения Rails to_date, to_datetime и to_time, чтобы они больше не были нужны.
#config/initializers/string.rb
class String
def to_date
begin
Date.strptime(self, '%m/%d/%Y') #attempt to parse in american format
rescue ArgumentError
Date.parse(self, false) unless blank? #if an error, execute original Rails to_date
#(pulled from Rails source)
end
end
def to_datetime
begin
DateTime.strptime(self,'%m/%d/%Y')
rescue ArgumentError
DateTime.parse(self, false) unless blank?
end
end
def to_time(form = :local)
begin
Time.strptime(self,'%m/%d/%Y')
rescue ArgumentError
parts = Date._parse(self, false)
return if parts.empty?
now = Time.now
time = Time.new(
parts.fetch(:year, now.year),
parts.fetch(:mon, now.month),
parts.fetch(:mday, now.day),
parts.fetch(:hour, 0),
parts.fetch(:min, 0),
parts.fetch(:sec, 0) parts.fetch(:sec_fraction, 0),
parts.fetch(:offset, form == :utc ? 0 : nil)
)
form == :utc ? time.utc : time.getlocal
end
end
end
В любом случае, это отлично работает в консоли rails; «24.06.2014».to_date и варианты ведут себя точно так, как я бы хотел. Однако, похоже, что ActiveRecord не использует эти перегруженные определения при создании / проверке новых записей таблицы, например
MyModelName.create(start_date:"06/07/2014")
указывает дату начала 2014-07-06.
Что я могу сделать, чтобы ActiveRecord распознал эти перегруженные определения?
Комментарии:
1. Вы знаете, что jQuery-UI datepicker может использовать два формата одновременно , верно? Пользовательский интерфейс может делать все, что захочет, но вся связь с сервером и с сервера должна осуществляться с использованием разумных форматов ISO 8601.
2. На самом деле вам не следует менять значение встроенных методов. Добавление вашего собственного должно быть приемлемым, но в этом также нет необходимости.
Ответ №1:
Вы можете установить форматы времени и даты по умолчанию в файле config / application.rb таким образом:
my_date_formats = { :default => '%d.%m.%Y' }
Time::DATE_FORMATS.merge!(my_date_formats)
Date::DATE_FORMATS.merge!(my_date_formats)
Ответ №2:
Драгоценный камень ruby-american_date может быть тем, что вам нужно. Он заставляет Date / DateTime /Time.parse анализировать даты в американском формате. Просто включите его в Gemfile вашего проекта.