2011-02-03 15 views
3

私のユーザは%d /%m /%Yの日付フォーマットを使用したいとします(例:26/02/2011)。それが正常に動作しています日付文字列を変換してレール付きデータベースに保存するときに使用するフォーマット

environment.rb : 

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
    :default => "%d/%m/%Y" 
) 

が、この形式で入力された日付文字列を保存しようとしたとき、私は一つの問題があります。environment.rbにでデフォルトフォーマット:

が正しく日付を表示するためには、私は、それゆえに変更しましたデータベース。

Railsは%d /%m /%Yの代わりに%m /%d /%Yの文字列をとっているようです。
04/02/2011は2011-04-02と26/02として保存されています私が使用することができ

mymodel.rb : 

def datefield_formatted 
    datefield.strftime '%m/%d/%Y' 
end 

def datefield_formatted=(value) 
    self.datefield = Time.parse(value) 
end 


view.html.erb : 

<%= form.input :datefield_formatted %> 

:/ 2011は、私は、このためのソリューションを探したが私が見つけたものは下記のような私のモデルで日付を再フォーマットに依存している...

単に無効と保存されていませんこのソリューションは、すべての '日付フィールド'(私のアプリケーションでは多くがあります)のために私のモデルの変更が必要になります。

これで、データベースに変換して保存するときに、Railsに%d /%m /%Yという文字列を正しく読み取らせるように指示するのが不思議でした。

答えて

1

私は最終的にStackoverlowをより深く検索する解決策を見つけました。

このブログ記事は問題を説明し、解決策を提示しています: http://blog.nominet.org.uk/tech/2007/06/14/date-and-time-formating-issues-in-ruby-on-rails/

だから我々は持っている:のlib /コラムpatch.rb

class ActiveRecord::ConnectionAdapters::Column 

def self.string_to_date(string) 
    return string unless string.is_a?(String) 

    begin 
     return DateTime.strptime(string, ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS[:default]) 
    rescue 
     date_array = ParseDate.parsedate(string) 
     # treat 0000-00-00 as nil 
     Date.new(date_array[0], date_array[1], date_array[2]) rescue nil 
    end 
end 

def self.string_to_time(string) 
    return string unless string.is_a?(String) 

    begin 
    if dt=Date._strptime(string,ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS[:default]) 
     return Time.mktime(*dt.values_at(:year, :mon, :mday, :hour, :min, :sec, :zone, :wday)) 
    else 
     raise "Bad format" 
    end 
    rescue 
     time_hash = Date._parse(string) 
     time_hash[:sec_fraction] = microseconds(time_hash) 
     time_array = time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction) 
     # treat 0000-00-00 00:00:00 as nil 
     Time.send(ActiveRecord::Base.default_timezone, *time_array) rescue DateTime.new(*time_array[0..5]) rescue nil 
    end 
end 

end 

をそして、我々はのconfig/environment.rbに

require 'column-patch' 
1

日付を通常のSQL形式(つまり、日付フィールドはvarcharではない)に保存し、%d /%m /%Yにのみ表示するのが最善の方法だと思います。 私は通常、ローカリゼーションファイルとl(日付)関数を使用します。例: ローカライゼーション・ファイル内の この

 
date: 
    formats: 
    default: "%d/%m/%Y" 

と、このあなたはビューで日付を使用どこ l(date)

もう一つのアイデアは、それが日付を節約する方法のActiveRecordをオーバーロードすることであるが、これはやり過ぎのビットです:/

+0

日付が日付フィールドとして保存されているに追加SQL。 - これが私の問題です。私のフォームは日付として保存された文字列を送信しますが、Railsは日付を適切な形式で解析しません。 – LapinLove404

+0

はい、DATE_FORMATSを変更したため、ローカリゼーションを行っても問題ありません。 – Devenv

+0

DATES_FORMATSを削除してローカリゼーションを使用していませんでした。 - 私のフォームが2011年2月6日の日付文字列を送信すると、2011-02-06の代わりに2011-06-02として保存されます。 :-( – LapinLove404

関連する問題