Ruby`enight`没有运行

时间:2012-05-09 13:49:36

标签: 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_time_zone(account.timezone) do
  Time.parse(@time)
end

但是,当我运行我的测试时,将时区设置为EST开始,但是当需要比较时间时,Time.zone将被设置为该块中最后一次使用的时区。因此告诉我没有调用ensure方法,并且没有重置Time.zone。

有人知道为什么会这样吗?

3 个答案:

答案 0 :(得分:6)

也许,您正在对该方法进行嵌套调用?由于您没有维护堆栈,因此第一次嵌套调用将导致@old_time_zone的早期值丢失。

如果这是正在发生的事情,只需停止使用实例变量,然后使用局部变量(无@符号)。方法的每个嵌套调用都有自己的局部变量,它们仍然在ensure块的范围内。

答案 1 :(得分: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

答案 2 :(得分:0)

在确保运行后,检查Time.zone的值是不够的,因为其他内容可能已经改变了它。

要隔离问题,请尝试在ensure块中输入一条消息以确保它已运行