Как сделать формат даты в США по умолчанию при сохранении в модель в Rails 3 - PullRequest
7 голосов
/ 28 октября 2010

В США дата была принята / проанализирована правильно, но больше не в Rails 3.% Y-% m-% d принимается, но не% m /% d /% Y

g = Grant.new
g.budget_begin_date = '12/31/2010'
#g.budget_begin_date returns nil
g.budget_begin_date = '2010-12-31'
#g.budget_begin_date returns Fri, 31 Dec 2010 00:00:00 UTC +00:00

Ответы [ 5 ]

4 голосов
/ 08 ноября 2012

Начиная с Ruby 1.9, Date.parse перестал обрабатывать неоднозначный формат мм / дд / гггг (американский формат) или дд / мм / гггг (остальной цивилизованный формат мира).

Драгоценный камень american_date, связанный здесь , делает предположение более старым, чем Руби, и, таким образом, может анализировать американскую дату, как и ожидалось.

4 голосов
/ 07 октября 2012

Ваш пример кода не совсем показывает, что Date.parse не может интерпретировать даты в стиле США, но вы правы, это не так.Вместо этого:

Date.parse("12/31/2010")

Используйте это:

Date.strptime("12/31/2010", "%m/%d/%Y")
1 голос
/ 02 апреля 2011

Если вы не против использования камня, вы можете проверить Хронический камень: https://github.com/mojombo/chronic

Вы можете настроить Chronic на анализ даты начала до сохранения модели.

0 голосов
/ 07 марта 2018

В современном ruby ​​(т. Е. С prepend) вы можете вставить свой собственный кастинг типов перед Rails. Вы захотите сделать это для любых других форматов даты / времени, которые вы используете. Вот код для Date, просто вставьте его в config/initializers/typecasts.rb или где-то:

module Typecasting
  module Date
    def cast_value v
      ::Date.strptime v, "%m/%d/%Y" rescue super
    end  
  end  

  ::ActiveRecord::Type::Date.prepend Date
end

Rails попробует американский формат и вернется к использованию встроенного метода, если это не сработало.

0 голосов
/ 27 июля 2012

Класс Date вызывает метод self.parse для анализа предоставленной строки до даты.

1.9.2p320 :051 > x = Date.parse('2011-31-12')
ArgumentError: invalid date
from .../rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/date.rb:1022:in `new_by_frags'
from .../rubies/ruby-1.9.2-p320/lib/ruby/1.9.1/date.rb:1066:in `parse'

, которая в свою очередь вызывает метод self "_parse", который находится в файле "... / ruby-1.9.2-p320 / lib / ruby ​​/ 1.9.1 / date / format.rb ".

вызывает функцию strftime (" def strftime (fmt = '% F') "), где по умолчаниюформат для форматирования даты - «% F», который согласно документации класса «Время» - «% F - формат даты ISO 8601 (% Y-% m-% d)».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...