0

Rails と ActiveRecord のデフォルトのタイムゾーンを設定するにはどうすればよいですか? 時間が表示される場所がたくさんあります(たとえば、データベース内のインスタンスの作成など)。時間は現在のタイムゾーンで表示されます。ホスティング プラットフォームで使用している Rails/ActiveRecord または *nix ディストリビューションを何らかの方法で構成する必要がありますか?

application.rb結果なしでファイルに追加しようとしました:

config.time_zone = 'Moscow'
config.active_record.default_timezone = :local

私も使ってみました

config.time_zone = 'Moscow'
config.active_record.default_timezone = "Moscow"

しかし、その場合、私は警告を受け取ります

warning: :database_timezone option must be :utc or :local - defaulting to :local

時間がレンダリングされるすべての場所を変更できないようにする解決策はありますか?

4

2 に答える 2

0

まず最初に、AR がタイム スタンプを保存する方法をいじらないように常に心がけています。なぜなら、Rails はすでに時間変換に関するすべての魔法を行っているからです。

現在のユーザーが選択したタイム ゾーン (または他の方法でユーザーごとに決定したタイム ゾーン) でアプリの時間を表示したいと思います。config.time_zoneその場合、明らかに上書きしたいので、で構成したものは重要ではありません。Rails には、このための と呼ばれるきちんとしたメカニズムがありTime.use_zoneます。

around_filter次のように、以前にそれを使用しました。

around_filter :set_time_zone

def set_time_zone
  Time.use_zone(current_user.try(:time_zone) || Time.zone) do
    yield
  end
end

これにより、現在のリクエストのタイム ゾーンが current_user の time_zone に設定されます (そのユーザーが存在する場合)。それ以外の場合は、application.rb で構成されたタイム ゾーンに戻ります。

ブロック内ではTime.use_zone、すべての時間が表示され、そのゾーンのように保存されます。

このアプローチの非常に便利な点は、各リクエストの後にタイム ゾーンが構成されたものにリセットされることです。Time.zone を変更するだけで、わざわざリセットしないと、他のユーザーに漏洩する可能性があります。

これが何を意味するのか頭を悩ませる前に、これを試してみて、あなたが望むように動作するかどうかを確認することをお勧めします. 興味があれば、その方法と理由について詳しく説明させていただきます。

于 2013-10-31T21:51:20.920 に答える