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因为在确保运行后其他东西可能已经改变了它..

要隔离问题,请尝试在确保块中包含一条消息以确保它已运行或未运行

于 2012-05-09T14:08:57.263 回答