2012-10-02 2 views
1

와 부분 렌더링에 : 뷰에서 렌더링 할 때정의되지 않은 메서드`fragment_for 'NilClass 나는 레일 2.3.14에 대한 몇 가지 코드에 대한 부분에이 코드 조각이 캐시

<% cache "some_partial_#{some_id}" do %> 
.... 
<% end %> 

잘 작동합니다 하지만 난 얻을 :

undefined method `fragment_for' for nil:NilClass 

내가 모델에서이 작업을 수행하려고하면

ActionView::Base.new("app/views").render(:partial => "home/temp"} 

내가 actionpack-2에서 발생하는 문제를 볼 수 있습니다. 3.14/lib 디렉토리/ACTION_VIEW/헬퍼/cache_helper.rb : 35

def cache(name = {}, options = nil, &block) 
    @controller.fragment_for(output_buffer, name, options, &block) 
end 

가 나는 @Controller에서 찾을 것으로 예상 정확히 모르겠어요.

답변

0

요약하면 모델에서 부분을 렌더링하지 마십시오. 비즈니스 논리 만 포함해야합니다. 캐쉬는 여기에서 뷰 렌더링 논리를 우회하기 때문에 초기화하지 않은 컨트롤러 객체를 호출하므로 오류가 발생합니다.

UPDATE :

내가 그것을 컨트롤러 인스턴스를 얻을 PARAM로 전달하는 것입니다 볼 수있는 유일한 방법입니다. 모델 안의 컨트롤러 인스턴스를 얻는 방법은 당신에게 달려 있습니다.

include ActionController::Caching 

를 클래스에 : 나는 this question 당신은 추가 할 수 있습니다

ActionView::Base.new("app/views", {}, @your_controller_instance).render(:partial => "home/temp") 
+0

모델에서 렌더링하는 것이 대단히 나쁜 습관에 동의하지만,이 큰 응용 프로그램 중 많은 기능이 그런 기능을 사용하기 때문에 선택의 여지가없는 상황 중 하나입니다. 나는 def cache를 오버라이드하고 컨트롤러를 배치하려고 시도했다. 그러나 ApplicationController는 예상대로 ApplicationController는 실제로 어디에도 fragment_for를 정의하지 않았으므로 그 컨트롤러에서 뭔가 다른 것을 기다리고있다. – Razvan

+0

내 업데이트 된 답변보기 @ user1713669 –

0

시도 도움이 될 수 있다고 생각.