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

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方法没有被调用,时区也没有被重置。
有人知道为什么会这样吗?

最佳答案

也许,您正在对该方法进行嵌套调用?由于不维护堆栈,第一个嵌套调用将导致先前的@old_time_zone值丢失。
如果是这样的话,就停止使用实例变量,而是使用一个局部变量(no@sign)方法的每个嵌套调用都有自己的局部变量,它们仍在ensure块的作用域中。

关于ruby - Ruby`ensure`没有运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10517489/

10-09 02:38