1

モデルのプライベートメソッドで実行されている単純なメソッドがあります。

def with_time_zone(zone)
  @old_time_zone = Time.zone
  Time.zone = self.account.timezone
  Chronic.time_class = Time.zone
  yield
ensure
  Time.zone = @old_time_zone
  Chronic.time_class = @old_time_zone
end

私はそれをこのように使用します:

with_time_zone(account.timezone) do
  Time.parse(@time)
end

ただし、テストを実行するときは、タイムゾーンをESTに設定して開始しますが、時間を比較するときはTime.zone、そのブロックで最後に使用されたタイムゾーンに設定されます。したがって、ensureメソッドが呼び出されておらず、Time.zoneがリセットされていないことを通知します。

なぜこれが起こっているのか誰もが知っていますか?

4

3 に答える 3

6

おそらく、メソッドに対してネストされた呼び出しを行っていますか?スタックを維持しないため、最初のネストされた呼び出しにより、以前の値@old_time_zoneが失われます。

それが起こっている場合は、インスタンス変数の使用をやめ、代わりにローカル変数を使用してください(@符号なし)。メソッドのネストされた各呼び出しには独自のローカル変数があり、それらはensureブロック内のスコープ内にあります。

于 2012-05-09T14:02:53.640 に答える
3
def with_time_zone(zone)
  old_time_zone = Time.zone
  Chronic.time_class = Time.zone = zone
  yield
ensure
  Chronic.time_class = Time.zone = old_time_zone
end

with_time_zone(account.timezone) do
  Time.parse(some_time)
end
于 2012-05-09T14:22:16.007 に答える
0

Time.zone確認が実行された後に他の何かが値を変更した可能性があるため、の値を確認するだけでは不十分です。

問題を特定するには、ensureブロックにメッセージを入れて、実行されたかどうかを確認してください。

于 2012-05-09T14:08:57.263 に答える