別のコントローラーのビューで1つのコントローラーのヘルパーメソッドにアクセスできるのはなぜですか? Railsをハッキング/パッチングせずにこれを無効にする方法はありますか?
@George Schreiberのメソッドは、Rails 3.1;の時点では機能しません。コードは大幅に変更されました。
ただし、Rails 3.1(できれば後で))でこの機能を無効にするさらに良い方法があります。config/ application.rbに次の行を追加します。
config.action_controller.include_all_helpers = false
これにより、 ApplicationControllerがすべてのヘルパーをロードするのを防ぎます 。
(興味のある方は、 機能が作成されたプルリクエストはこちら です。)
答えはRailsバージョン。
変更 include_all_helpers
構成を適用するすべての環境でfalse
に構成します。構成をすべての環境に適用する場合は、application.rb
。
config.action_controller.include_all_helpers = false
Falseの場合、 包含をスキップ になります。
ApplicationController
から次の行を削除します
helper :all
このようにして、各コントローラーは独自のヘルパーをロードします。
In 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
;に含まれる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のデフォルトの機能はすべてのヘルパーを含めることでした。
7年2月24日20:33:47のチェンジセット6222(3年前)by dhh :すべてのヘルパーを常に必要としているというデフォルトの仮定を作成します(ええ、ええ)
change:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
end
Rails 3 beta 1の時点で、CHANGELOGに記載されているように、もはやそうではありません。