2012-05-09 66 views
1

我有一个简单的方法在我的模型的私有方法运行:红宝石`ensure`没有运行

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未被重置。

任何人都知道为什么会发生这种情况?

回答

6

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

如果这是怎么回事,就停止使用一个实例变量,并使用一个局部变量来代替(不是@符号)。该方法的每个嵌套调用都有其自己的局部变量,并且它们仍位于ensure块中的范围内。

0

这是不够的,检查Time.zone值作为别的东西可能已经改变了它确保运行后..

隔离问题,尝试有在确保块的消息,以确保它有是否运行

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