모든 Rails 도우미를 모든 뷰에서 항상 사용할 수있는 이유는 무엇입니까? 이것을 비활성화하는 방법이 있습니까?


89

다른 컨트롤러의 뷰에서 한 컨트롤러의 도우미 메서드에 액세스 할 수있는 이유는 무엇입니까? Rails를 해킹 / 패칭하지 않고 이것을 비활성화하는 방법이 있습니까?


3
새롭고 더 관련성이 높은 답변이 있습니다. Craig Walkers 답변 확인
EE33

답변:


106

@George Schreiber의 방법은 Rails 3.1에서 작동하지 않습니다. 코드가 크게 변경되었습니다.

그러나 이제 Rails 3.1에서이 기능을 비활성화하는 더 좋은 방법이 있습니다. config / application.rb에 다음 행을 추가하십시오.

config.action_controller.include_all_helpers = false

이렇게하면 ApplicationController가 모든 도우미를로드하지 못합니다 .

(관심있는 사람을 위해 여기에 기능이 생성 된 풀 리퀘스트가 있습니다.)


나는 3.2에 있습니다. 여기서 application.config는 config / application.rb를 의미합니까?
Brandon Henry

include_all_helpers를 비활성화하거나 수동으로 포함해야하는 경우 ApplicationHelper도 포함됩니까?
Robert Audi

@AzizLight 나는 테스트하지 않았기 때문에 확실하지 않습니다. 그러나 ApplicationHelper는 항상 뷰에서 "루트"도우미로 사용할 수 있도록 의도되었으므로 그렇게 할 것으로 예상합니다. 여기서 주요 문제는 관련없는 컨트롤러의 도우미입니다.
Craig Walker

3
이것이 기본 동작이어야한다고 생각합니다.
Nafaa Boutefer 2014

98

대답은 Rails 버전에 따라 다릅니다.

레일> = 3.1

구성을 적용하려는 환경에서 include_all_helpers구성을 false로 변경하십시오 . 구성을 모든 환경에 적용하려면에서 변경하십시오 application.rb.

config.action_controller.include_all_helpers = false

거짓이면 포함건너 뜁니다 .

레일스 <3.1

다음 줄을 삭제하십시오. ApplicationController

helper :all

이러한 방식으로 각 컨트롤러는 자체 헬퍼를로드합니다.


2
이 라인은 Rails 3.2에 존재하지 않으므로이 솔루션은 더 이상 Rails의 이후 버전에 적용되지 않을 것입니다.
Tyler Collier

@TylerCollier가 말한 것!
EE33

왜 이것이 Rails의 3.1 버전에서 그렇게 크게 바뀌 었는지 궁금합니다. 나에게 그다지 이해가되지 않는다.
여호수아 Muheim

6
참고 : 위의 의견은 대답이 레일> 3.1 포함하도록 업데이트되었습니다 이니까, 더 이상 유효
카일 Heironimus을

3
참고 : ApplicationHelper는 계속로드됩니다. 특정 도우미를 항상 포함하려면 include HelperNameApplicationHelper 상단에 추가 할 수 있습니다 .
반산

27

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

10
당신 clear_helpers이 (성능) 을 호출 할 때까지 모든 헬퍼가로드 된 이후 이미 피해가 발생했습니다. 당신은 정말 사용하려는 config.action_controller.include_all_helpers = false(@Craig 워커 위의 상태로)이 처음에로드되는 것을 헬퍼를 방지로, 따라서 당신에게 (개발 모드에 가장 크게 아마도) 몇 가지 성능을 확보,. actioncontroller/base.rb스 니펫 을 포함 해 주셔서 감사합니다 . 코드를보고 미스터리를 제거하는 것은 항상 좋은 일입니다.
George Anderson

clear_helpers레일 3.0에 여전히 유용합니다 config.action_controller.include_all_helpers = false. 레일 3.1 이상에만 해당됩니다.
robd

5

실제로 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에 명시된 경우가 아닙니다.

  • ActionController :: Base는 이제 Rails의 기본 ApplicationController에 의존하는 대신 helper : all을 수행합니다. [DHH]

1
그렇다면 Rails 3에서는 모든 헬퍼가 기본적으로 항상로드된다는 의미입니까?
Nik So

@Nik 확실히 예,이어야 3.2
니씬
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.