2012-03-21 2 views
3

나는 비슷한 동작을 할 많은 컨트롤러가 있습니다. 사용자가 로그인해야하고 일부 범위를 설정해야하며 current_account/current_user를 설정하고 사용 권한을 캐시해야합니다.contollers를 서브 클래 싱하는 경우와 수퍼를 호출 할 때

나는 표준 컨트롤러를 사용하여 하위 클래스로 생각한다고 생각한다.

class MyStandardController < ApplicationController 
before_filter :xyz 
end 

class SomeController < MyStandardController 
end 

내가 궁금하네요 나는/때 전혀 super를 호출해야합니까입니까?

감사

+0

authlogic과 같은 보석으로 처리하거나 cancan으로 고안하는 것이 가장 좋은 서라운드 사용자 인증을 참조하고있는 대부분의 작업 (해당 작업은 사용자 권한입니까?) 및 권한 부여 (특정 리소스에 대한 액세스 권한이 있습니까? –

+0

나는 devise를 사용하고 있는데 cancan을 사용할 수 있습니다. –

답변

5
혹시 다른 컨트롤러에서 상속 컨트롤러 내부 super를 호출 할 필요는 없습니다

; 실제로 그렇게하면 이상하게 느껴질 것입니다. Super는 수퍼 클래스에서 같은 이름의 메서드를 실행합니다. MyStandardController에 대한 메서드가 없기 때문에 자식으로 재정의 할 수 있습니다.

이렇게하는 주된 이유는 필터와 메서드를 여러 컨트롤러에서 쉽게 네임 스페이스로 가져 오는 것입니다. 매우 유사한 동작을하는 사이트의 한 영역이 ShoppingController와 같은 컨트롤러에서 상속되며 모든 자식에 대해서만 사용할 수있는 개인 편의 메소드 섹션이있는 앱에서 이와 비슷한 작업을 수행합니다.

그러나 현실적으로 말해서 원하는 기능을 구현하는 모듈을 원하는 컨트롤러에 포함시키는 것이 더 나을 것입니다. 결국 한 컨트롤러에서 다른 컨트롤러로 무언가를 원할 것입니다. 복잡한 상속 계층 구조를 사용하는 것보다 모듈을 사용하는 것이 더 쉽습니다.

+0

Veraticus와 완전히 동의합니다. 간단한 해결책은'before_filter'를'application_controller.rb'에 넣는 것입니다. 이것은 인증과 같은 경우에 일반적입니다. 네임 스페이스 (예 : "Admin")가 적용되는 애플리케이션의 액션의 하위 집합 인 경우, Admin :: UserManager와 같은 모델 (및 뷰와 컨트롤러)을 포함하는 모듈을 만드는 것은 끔찍한 생각이 아닙니다. before_filter는'admin_controller.rb'에 정의 될 수 있습니다. (제 생각에는) –

+1

메소드를 정의하면 감사합니다. MyStandardController의 mydef, 내 뷰에서 어떻게 사용할 수 있습니까? helper_method를 사용하여 MyStandardController에서 도우미를 지정하면 contollers가 사용하는 뷰에서 사용할 수있는 것처럼 보이지 않습니다. –

+0

아마 그렇게해서는 안됩니다. 대신 헬퍼 메소드를 사용하거나 컨트롤러 액션에서 메소드를 호출하고 인스턴스 변수를 통해 결과를 뷰에서 사용할 수있게하십시오. – Veraticus