3

私は、アプリケーションで日付をローカライズするために 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

ただし、これはまだ適合しません。検証エラーに日付を使用すると、アクティブなレコードがデータベースに送信された文字列値を使用しているように見えるためです。

ビュー、フォーム ビルダー、アクティブ レコードのエラー メッセージ全体で一貫して日付形式をローカライズする方法を教えてください。

助けてくれてありがとう

4

1 に答える 1

1

Date の to_s メソッドをオーバーロードすることは、私にとって大きな問題です。

コンテキストに応じて日付を異なる形式でフォーマットし、それを確実に行うことができる魔法のソリューションは考えられません;)

必要な場合にのみ日付形式を指定し続け、場合によってはdate.formats.defaultロケール ファイルの翻訳を上書きして、形式をユーザーにとってより使いやすいものにすることをお勧めします (これにより、 の形式も修正されるはずtext_fieldです)。

于 2012-05-17T13:15:58.797 に答える