Ruby on rails Rails ActiveSupport扩展到\u日期、到\u日期时间、到\u时间

Ruby on rails Rails ActiveSupport扩展到\u日期、到\u日期时间、到\u时间,ruby-on-rails,ruby,activerecord,activesupport,to-date,Ruby On Rails,Ruby,Activerecord,Activesupport,To Date,我使用的应用程序坚持以非标准的美式%m/%d/%Y格式显示所有用户输入日期(通过jquery datepicker)。因此,我们有许多strtime方法分散在我们的控制器中 我正在尝试清理它,并希望将Rails重载到\u date、到\u datetime和到\u time扩展,这样就不再需要这些了 #config/initializers/string.rb class String def to_date begin Date.strptime(self, '%m

我使用的应用程序坚持以非标准的美式%m/%d/%Y格式显示所有用户输入日期(通过jquery datepicker)。因此,我们有许多
strtime
方法分散在我们的控制器中

我正在尝试清理它,并希望将Rails重载到\u date、到\u datetime和到\u 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控制台中非常有效;“06/24/2014”。到目前为止,所有的版本都完全符合我的要求。然而,在创建/验证新表项时,ActiveRecord似乎不使用这些重载定义,例如

MyModelName.create(开始日期:“06/07/2014”)
给出了2014-07-06的开始日期


如何使ActiveRecord识别这些重载定义?

您可以通过以下方式在config/application.rb文件中设置默认时间和日期格式:

my_date_formats = { :default => '%d.%m.%Y' }
Time::DATE_FORMATS.merge!(my_date_formats) 
Date::DATE_FORMATS.merge!(my_date_formats)

宝石可能是你想要的。它强制Date/DateTime/Time.parse解析美国格式的日期。只需将其包含在项目的GEM文件中。

您知道jQuery UI datepicker可以使用,对吗?用户界面可以做任何它想做的事情,但是与服务器之间的所有通信都应该使用合理的ISO8601格式。你不应该真正改变内置方法的含义。添加您自己的应该是可以接受的,但也没有必要。