Rails ActiveSupport расширяет to_date, to_datetime, to_time

#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 вашего проекта.