2012-05-09 2 views
1

내가 내 모델의 private 메소드에서 실행하는 간단한 방법이 실행되지 않습니다루비`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 

I는 다음과 같이 사용 :

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