1

私が使用しているアプリケーションは、すべてのユーザー入力日付を (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

とにかく、これはレールコンソールでうまく機能します。"06/24/2014".to_date とバリアントは、私が望むとおりに動作します。ただし、ActiveRecord は、新しいテーブル エントリを作成/検証するときに、これらのオーバーロードされた定義を使用していないようです。

MyModelName.create(start_date:"06/07/2014")開始日は 2014-07-06 です。

これらのオーバーロードされた定義を ActiveRecord に認識させるにはどうすればよいですか?

4

2 に答える 2

0

config/application.rb ファイルでデフォルトの時刻と日付の形式を次のように設定できます。

my_date_formats = { :default => '%d.%m.%Y' }
Time::DATE_FORMATS.merge!(my_date_formats) 
Date::DATE_FORMATS.merge!(my_date_formats)
于 2014-06-24T20:12:31.087 に答える