2012-05-09 67 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