私は、アプリケーションで日付をローカライズするために 1 日のほとんどを費やしてきました。
このhttp://guides.rubyonrails.org/i18n.htmlを読むと、 I18n.l(date) がそれを行う方法のようです。
ビューに日付オブジェクトを直接レンダリングするだけであれば、これで問題ありません。ただし、多くの場合、フォームフィールドに日付を表示したい:
= form_for @object do |f|
.field
= f.label :date
= f.text_field :date
これは、日付オブジェクトで to_s を呼び出し、ローカライズなしでそれを使用しているようです。
私が試した最初の回避策は、I18n.l を使用するように日付クラスにモンキー パッチを適用することでした。
class Date
def to_s
I18n.l(self)
end
end
日付をレンダリングするたびに I18n.l を呼び出すことを覚えておく必要がないので、これは良いことのように思えました。ただし、ロケール固有の形式はクエリ文字列では意味がないため、この方法ですべてのデータベースクエリが壊れます!
これを修正するために、パッチに追加のロジックを追加しました。
class Date
def to_s(type = nil)
if(type == :db)
self.strftime("%Y-%m-%d")
else
I18n.l(self)
end
end
end
ただし、これはまだ適合しません。検証エラーに日付を使用すると、アクティブなレコードがデータベースに送信された文字列値を使用しているように見えるためです。
ビュー、フォーム ビルダー、アクティブ レコードのエラー メッセージ全体で一貫して日付形式をローカライズする方法を教えてください。
助けてくれてありがとう