2015-01-19 9 views
11

나는 서로를 참조하는 두 부분이 있습니다. 내 자체 참조 템플릿이 콘솔 및 레이크에서는 캐시 다이제스트 계산을 중단하지만 서버에서는 그렇지 않습니다.

finder = ApplicationController.new.lookup_context 
ActionView::Digestor.new(name: "posts/show", finder: finder).nested_dependencies 

정도 등의 레이크 작업을 통해

:

rake cache_digests:nested_dependencies TEMPLATE=posts/show 

내가 짧은 목록을 콘솔이 너무 좋아에 나는 (템플릿이로드되고 일부 디버그 코드 출력으로) 중첩 된 종속성을 계산할 때

... 
>>>>>>> users/foo 
>>>>>>> users/bar 
>>>>>>> users/baz 
>>>>>>> users/bip 
>>>>>>> users/foo 
>>>>>>> users/bar 
>>>>>>> users/baz 
>>>>>>> users/bip 
SystemStackError: stack level too deep 

(템플릿 이름 변경)

: 루비 스택이 가득 찰 때까지 무한 루프의 다음 초기 의존성과의

그러나 앱 서버를 실행하고 템플릿을 요청하면 무한 루프가 발생하지 않습니다. 여기

위의 모든 경우에 내 설정은 다음과 같습니다

https://github.com/rails/rails/blob/v4.1.8/actionview/lib/action_view/digestor.rb#L35는 왜 보호의 서버 환경이 아닌에서 일하고 :

config.action_controller.perform_caching = true 
config.cache_store = :file_store, Rails.root.to_s + '/tmp/cache/stuff' 
ActionView::Base.cache_template_loading = true 

코드는 재귀 참조 보호 기능을 가지고 있음을 나타냅니다 콘솔이나 갈퀴 작업?

(또한 GitHub의 문제 https://github.com/rails/rails/issues/18667)

+0

레일 및 레이크 작업은 완전히 다른 두 가지 방법을 사용합니다. Rails는 무한 루프 보호 기능을 가진'compute_and_store_digest'를 호출하는'ActionView :: Digestor.digest'를 호출합니다. 그러나'nested_dependencies'는 무한 루프 탐지없이 재귀 적으로'DependencyTracker.find_dependencies' 만 호출합니다. github에서'nested_dependencies'의 사용법을 확인한다면, 그것은 rake 태스크와 다른 곳에서 사용 된 것만 볼 수 있습니다. 그래서 IMHO는'nested_dependencies'의 버그입니다. – nemesv

+0

감사합니다 ... 왜이 코멘트입니까? –

답변

1

레일 및 레이크 태스크 두 개의 완전히 다른 메소드 ActionView::Digestor을 이용한다.

  • 레일은 일반적으로 무한 루프 보호 기능을 compute_and_store_digest를 호출 ActionView::Digestor.digest 호출합니다.

  • 그러나 nested_dependencies은 무한 루프 검색없이 재귀 적으로 DependencyTracker.find을 호출합니다.

경우 당신이 그것을 만 다른 곳 레이크 작업에서 사용되는 것을 볼 수 있습니다 GitHub의에 nested_dependenciescheck for usages.

그래서 IMHO이 버그nested_dependencies입니다.