2013-05-02 4 views
0

필자는 컨트롤러 전후에 반복적 인 코드를 삽입하여 컨트롤러를 건조시키고 싶습니다.respond_to in after_filter

respond_to do |wants| 
    wants.html 
    wants.js { render :layout => "transition" } 
end 

내가 이렇게 같은 after_filter이 배치 : 내 현재 프로젝트에서 모든 작업이 같은 respond_to 블록이

after_filter :respond_to_html_or_transition 

을하지만이 오류에 이르게 :

Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".

이는 액션 내에 명시적인 respond_to 또는 redirect이없는 경우에도 발생합니다. 레일즈 (명백한 respond_to 호출의 부족에 대한)가 교훈있는 추측을 만들고 after_filter 앞에 자신의 respond_to을 생성하기 때문에이 문제가 발생한다고 가정합니다. 그렇다면 Rails가 그 일을 못하게하고 대신 블록을 after_filter에 사용하는 방법이 있습니까?

답변

0

after_filter를 사용하여 수행하려는 작업을 수행 할 수 없습니다. 애프터 필터는 이미 렌더링 된 액션을 처리합니다. 이 시점에서 렌더링은 이미 완료되었으므로 (명시 적 또는 암시 적 렌더링) 렌더링을 호출하면 이중 호출이 발생합니다.

메서드에서 코드 논리를 추출하고 메서드를 호출 할 수 있습니다. 또 다른 방법은 액션의 본문을 단일 메서드로 처리 할 수 ​​있다고 가정하고 모든 액션을 단일 액션의 별칭으로 만드는 것입니다.

마지막으로, 당신은 사용자 지정 작업 응답을 쓸 수 있습니다 내가 구현에 문제가 있지만, 마지막 옵션은 최적의 경로처럼 보인다

self.responder = CustomActionResponder 
+0

설정 컨트롤러의 기본 하나를 교체합니다. 'render layout : "transition"으로'to_js' 메쏘드를 오버라이드하는 것은 효과가 없습니다. 렌더링되지만 '전환'레이아웃은 사용하지 않습니다. – nullnullnull

+0

방금 ​​작동했습니다. 'render layout : "transition"은 괜찮습니다. 진짜 문제는 응답자를 어떻게 할당했는지에 달려 있습니다. 컨트롤러 내부에'self.responder = CustomActionResponder'를두기보다는 각 액션의 끝에 respond_with (@items, : responder => CustomActionResponder)를 넣었다. 그것은 장황하지만 작동합니다. 왜 다른 접근법이 효과가 없는지 궁금합니다. 레일 4를 사용하고 있습니다. 아마 그것의 가치가 하락 했는가? 아니면 내가 제대로하지 않을거야? – nullnullnull