2012-04-05 18 views
14

保存に逆転している(私の問題はかなりdescribed in this questionと同じであり、唯一その答えは私の場合には動作しません。)Rails3/jQueryのUI日付ピッカー - 月と日が


私が使用していますPostgres DBを持つRailsアプリケーションでjQuery UI Datepickerデフォルトの実装では、mm/dd/yyの日付形式が使用され、選択した日付が表示されます。ただし、レコードをデータベースに保存すると、月と日が逆になり、yy-dd-mmと表示されます。したがって、3/11/2012を選択すると、3月11日ではなく11月3日として保存され、3/31/2012のような日付は存在しないため、まったく保存されません。

<%= f.text_field :foo, :value => (@model.foo.blank? ? '' : @model.foo.strftime('%m/%d/%Y')), class: "datepicker" %> 

これは、表示される:私は、この修正しようと、これまでダウン3つの異なる道を行ってきた

:ので表示は、私が望んでいたかに見えた

1)最初の試みは、テキストフィールドを再フォーマットすることでした2012年3月31日に正しく初期化されましたが、保存時には逆になりました。

2)次に、日付が格納されているデフォルトの方法を変更して、問題を回避することを考えました。これは、まったく違いはありませんでした

# config/locales/en.yml 
en: 
    date: 
    formats: 
     default: "%m/%d/%Y" 

this questionへの答えで述べたように、私はのconfig /ロケール/ en.ymlに以下を追加しました。次はthis questionを発見し、これらの行で設定/イニシャライザ/ date_formats.rbを作成しようとした:上記と同じ

Date::DATE_FORMATS[:default]="%m/%d/%Y" 
Time::DATE_FORMATS[:default]="%m/%d/%Y %H:%M" 

、差がありません。

3)たくさんの組み合わせで遊んだ後、私はDIDの仕事がdatepickerプラグインの呼び出しでyyyy-mm-dd形式を指定していたことを発見しました。日付を正常に保存することができます。カレンダーから

$(".datepicker").datepicker({ dateFormat: 'yy-mm-dd' }); 

選択月31日は、2012年3月31日にフィールドを移入し、まだ保存した後、2012年3月31日のように表示されますので、日付ピッカーの呼び出しは次のようになります。

しかし、mm/dd/yy形式で動作するようにdatepickerをどのように取得できますか?それは難しいことだとは想像できませんが、何が欠けていますか? Postgresに日付がどのように格納されているかを何かする必要がありますか? (日付ではなく日付で指定されています)

+0

、私はフィールドを「日付」ではなく「テキスト」に切り替えました。理想的ではありませんが、問題をむしろ簡単に解決します。 – ellawren

+0

何回か切り替えるのが理想的かどうかという良い解決策です。まだ問題を知りたいかもしれない好奇心のために、後であるかもしれません。 –

+0

Rails 3.2.3、PostgreSQLとRuby 1.9.3。 datepickerフォーマットはmm-dd-yyに設定されていましたが、しばらくの間働いていましたが、リファクタリングを行っていますが、いくつかの日付を面倒なく保存できますが、特に日付は保存されません。だから私はyy-mm-ddに再フォーマットするつもりで、何が起こるかを見ていきます。 – thomasvermaak

答えて

3

よくデータをデータベースに格納する方法によって異なります。 RAW sqlクエリを使用した場合は、挿入クエリでto_date('31 Mar 2012', 'DD Mon YYYY')を使用できます。

Postgresの今to_datereference

は、クライアント側では、jqueryの日付ピッカーであなたはそれがより明確に思えるので、私はDD月のYYYYを使用

$.datepicker.formatDate('dd-M-yy', Yourdate); 

を使用することができます。mm/dd/yy形式または必要に応じた他の形式を使用できます。そのような場合には、使用がpostgreのto_date機能に形式を必要

親切に注意してください、私は、コードの上にテストhaventは。何か問題がある場合、または何らかの問題に直面した場合は、コメントを残してください。

編集:

あなたのレールでDate.parse('2011-06-18')を使用することができ、データベースにデータを挿入する前に、表示と日付ピッカーで'yy-mm-dd'formatDateを設定します。

+0

あなたが言っていることを理解していないかもしれません。しかし、データベースに挿入する前に日付を並べ替えるbefore_saveメソッドを書こうとしました。これはうまくいくように聞こえましたが、何らかの理由で12日以上の日付を保存しようとするとエラーが表示されます。これは日と月の切り替えを試みているためですが、それがどこで起こっているのか把握してください。 – ellawren

+0

railsで生成されたクエリ(および日付列の値)をログに記録します。実際にどんな側の問題があるのか​​を知るために、 –

0

あなたのデータベースクラスタにグローバルにデフォルトの日付書式を変更したい場合はまた、あなたのpostgresql.confDateStyleGUCを設定し、リロードできます

datestyle = 'iso, mdy' 

(。とにかくデフォルトであるべきである)

これは、アプリに日付がどのように表示されるかには影響しないことに注意してください。 PostgreSQLがあいまいな入力とPostgresの出力オプションをどのように解釈するか


あなたは何も証明しない(明らかに)別の接続、中にはpsqlでdatestyle設定を確認してください。あなたのアプリはローカル設定に関連して別のdatestyleを設定しているかもしれません。実際の接続の中で設定をチェックする必要があります(psqlからではありません)。

データスタイルが'iso, mdy'の場合、日付リテラルは月前にと解釈されます。このデモを(PostgreSQL 9.1を使用して)検討してください:

 
db=# set datestyle = 'ISO, MDY'; 
SET 
db=# select '1.12.2012'::date; 
    date 
------------ 
2012-01-12 
(1 row) 

db=# set datestyle = 'ISO, DMY'; 
SET 
db=# select '1.12.2012'::date; 
    date 
------------ 
2012-12-01 
(1 row) 

強調鉱山。オプションは、実際にアプリで設定されている、あなたはpostgresql.conf

log_statement = all 

を設定し、リロードすることができ、見つけるために

。その後、アプリを起動して日付を保存します。すべてのコマンドが記録されます。

log_statement = none 

は、その後、あなたのアプリが実際にデータベースに送信されたものをごDBログファイルを確認してください。リセットし(またはログファイルが巨大な成長があります)、その後リロードすることを忘れないでください。


また、あなたが好きな任意の形式であなたの入力した日付リテラルをすることができますto_date()コマンド、に興味があるかもしれません。しかし、それは必要ありません。

+0

私はpsqlで 'show datestyle;'を行い、ISO、MDYを取得しました。 – ellawren

+0

異なる接続で 'psql'をチェックインすることは、ほとんど何もプルーフしません。私は私の答えにいくつかの情報を追加しました。 –

0

元のポスターと同じ問題が発生しました。日付/時刻を互いに比較する必要があるので、後で追加のコードと変換が必要になるため、DBフィールドを文字列に変更する必要はありませんでした。

私はこのように私のモデルにbefore_saveとattr_accessorを使用して終了:

before_save :format_date 
attr_accessor :unformatted_date 

def format_date 
    self.inquiry_date = Date.strptime(self.unformatted_date, "%m/%d/%Y").to_time(:utc) 
end 

私の見解では行は次のようになります。これ以上の壁に頭をバッシング停止するには

f.text_field :unformatted_date, :value => (@foo.inquiry_date.blank? ? '' : @foo.inquiry_date.strftime('%m/%d/%Y)), :id => 'datepicker' 
関連する問題