IT story

모든 Rails 도우미를 모든 뷰에서 항상 사용할 수있는 이유는 무엇입니까?

hot-time 2020. 9. 6. 12:00
반응형

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


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


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

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

config.action_controller.include_all_helpers = false

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

(관심있는 사람을 위해 여기에 기능이 생성 된 풀 요청이 있습니다 .)


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

레일> = 3.1

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

config.action_controller.include_all_helpers = false

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

레일스 <3.1

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

helper :all

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


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

실제로 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]

참고 URL : https://stackoverflow.com/questions/1179865/why-are-all-rails-helpers-available-to-all-views-all-the-time-is-there-a-way-t

반응형