簡體   English   中英

Rails ActiveSupport擴展了to_date,to_datetime,to_time

[英]Rails ActiveSupport extending to_date, to_datetime, to_time

我正在使用的應用程序堅持以非標准的美國%m /%d /%Y格式顯示所有用戶輸入的日期(通過jquery datepicker)。 結果,我們在控制器中分散了許多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控制台中效果很好。 “ 06/24/2014” .to_date和變體的行為完全符合我的要求。 但是,看起來ActiveRecord在創建/驗證新表條目時未使用這些重載定義,例如

MyModelName.create(start_date:"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)

ruby-american_date寶石可能就是您想要的。 它強制Date / DateTime / Time.parse解析美國格式的日期。 只需將其包含在項目的Gemfile中即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM