13

나는 레일 2.3.5에서 그리고 난이 문제가 : 필터 전에 foo를 두 번 호출됩니다 :컨트롤러가 서브 클래스 화 될 때 Rails before_filter가 두 번 호출되는 이유는 무엇입니까?

class BaseController < ApplicationController 
    before_filter :foo, :only => [:index] 
end 

class ChildController < BaseController 
    before_filter :foo, :only => [:index, :show, :other, :actions] 
end 

문제는 ChildController에서이 그입니다.

이 문제를 해결하기 위해 여러 가지 해결 방법을 시도했습니다. 자식에 :index 작업을 포함하지 않으면 해당 작업에 대해 절대로 호출되지 않습니다.

이 솔루션은 내가 작품을 찾았지만, 나는이 문제를 해결하기 위해 더 나은 방법이

skip_before_filter :foo 
before_filter :foo, :only => [:index, :show, :other, :actions] 

거기에 아주 아주 추한 생각?

답변

15

"이것은 의도적으로 설계된 동작입니다."

컨트롤러에 레일 가이드는 말한다 :

". 당신이와 ApplicationController에 필터를 설정하면,이 응용 프로그램의 모든 컨트롤러에서 실행할 수 있도록 필터, 상속"

이렇게하면 나타나는 동작을 설명합니다. 또한 특정 컨트롤러 및/또는 메소드에 대해 어떤 필터가 실행될 것인지 또는 실행되지 않을지를 정의하기 위해 skip_before_filter를 사용하여 제안하는 똑같은 솔루션을 제안합니다.

그래서보기 흉한 또는 아닙니다, 당신이 발견 한 해결책이 일반적이고 승인 된 연습 인 것처럼 보입니다. 당신이 skip_before_filter를 사용하지 않을 경우

http://guides.rubyonrails.org/action_controller_overview.html#filters

3

는 항상 ChildController에서 index 작업을 건너 뛸 수 :

class ChildController < BaseController 
    before_filter :foo, :only => [:show, :other, :actions] 
end 

을하지만 BaseController에서 동작을 변경하면이 문제가 될 수 있으며 index 조치에서 필터를 제거하십시오. 그렇다면 결코 호출되지 않을 것이므로 skip_before_filter을 사용하는 것이 더 좋은 생각 일 수 있습니다.