Ruby`sure`没有运行

Ruby`sure`没有运行,ruby,Ruby,在我的模型中,我有一个在私有方法中运行的简单方法: 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

在我的模型中,我有一个在私有方法中运行的简单方法:

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
将设置为该块中上次使用的时区。因此告诉我,
确保没有调用
方法,并且没有重置时区


有人知道为什么会发生这种情况吗?

也许,您正在对该方法进行嵌套调用?由于不维护堆栈,第一个嵌套调用将导致
@old\u time\u zone
的早期值丢失


如果是这样,就停止使用实例变量,改用局部变量(无
@
符号)。方法的每个嵌套调用都有自己的局部变量,它们仍然在
确保
块的作用域中。

也许,您正在对该方法进行嵌套调用?由于不维护堆栈,第一个嵌套调用将导致
@old\u time\u zone
的早期值丢失


如果是这样,就停止使用实例变量,改用局部变量(无
@
符号)。方法的每个嵌套调用都有自己的局部变量,它们仍然在
确保
块中的作用域中。

检查
Time.zone
的值是不够的,因为在确保运行后,其他东西可能会更改它


若要隔离问题,请尝试在“确保”块中包含一条消息,以确保它是否已运行。

仅检查
时区的值是不够的,因为在“确保”运行后,其他内容可能已对其进行了更改

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
要隔离问题,请尝试在“确保”块中包含一条消息,以确保该消息是否已运行

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