다른 컨트롤러의 뷰에서 한 컨트롤러의 도우미 메서드에 액세스 할 수있는 이유는 무엇입니까? Rails를 해킹 / 패칭하지 않고 이것을 비활성화하는 방법이 있습니까?
답변:
@George Schreiber의 방법은 Rails 3.1에서 작동하지 않습니다. 코드가 크게 변경되었습니다.
그러나 이제 Rails 3.1에서이 기능을 비활성화하는 더 좋은 방법이 있습니다. config / application.rb에 다음 행을 추가하십시오.
config.action_controller.include_all_helpers = false
이렇게하면 ApplicationController가 모든 도우미를로드하지 못합니다 .
(관심있는 사람을 위해 여기에 기능이 생성 된 풀 리퀘스트가 있습니다.)
include HelperName
ApplicationHelper 상단에 추가 할 수 있습니다 .
Rails 3에서 actioncontroller/base.rb
(라인 224 주변) :
def self.inherited(klass)
super
klass.helper :all if klass.superclass == ActionController::Base
end
예,에서 클래스를 파생 시키면 ActionController::Base
모든 도우미가 포함됩니다.
이 문제를 해결하려면 컨트롤러 코드 시작 부분 에서 clear_helpers
( AbstractClass::Helpers
; included in ActionController::Base
)를 호출 하십시오. clear_helpers에 대한 소스 코드 주석 :
# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.
예 :
class ApplicationController < ActionController::Base
clear_helpers
...
end
clear_helpers
이 (성능) 을 호출 할 때까지 모든 헬퍼가로드 된 이후 이미 피해가 발생했습니다. 당신은 정말 사용하려는 config.action_controller.include_all_helpers = false
(@Craig 워커 위의 상태로)이 처음에로드되는 것을 헬퍼를 방지로, 따라서 당신에게 (개발 모드에 가장 크게 아마도) 몇 가지 성능을 확보,. actioncontroller/base.rb
스 니펫 을 포함 해 주셔서 감사합니다 . 코드를보고 미스터리를 제거하는 것은 항상 좋은 일입니다.
clear_helpers
레일 3.0에 여전히 유용합니다 config.action_controller.include_all_helpers = false
. 레일 3.1 이상에만 해당됩니다.
실제로 Rails 2 에서 ActionController :: Base의 기본 기능은 모든 헬퍼를 포함하는 것이 었습니다.
Changeset 6222 on 02/24/07 20:33:47 (3 years ago) by dhh : 항상 모든 도우미를 원한다는 기본 가정으로 설정합니다 (예, 예).
변화:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
end
Rails 3 베타 1부터는 더 이상 CHANGELOG에 명시된 경우가 아닙니다.