別のコントローラーのビューで、あるコントローラーのヘルパーメソッドにアクセスできるのはなぜですか?Railsをハッキング/パッチせずにこれを無効にする方法はありますか?
回答:
@George SchreiberのメソッドはRails 3.1では機能しません。コードが大幅に変更されました。
ただし、Rails 3.1でこの機能を無効にするさらに良い方法があります(できれば後で)。config / application.rbに次の行を追加します。
config.action_controller.include_all_helpers = false
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
;に含まれる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 Walkerの状態のように)ヘルパーが最初にロードされるのを防ぎ、ある程度のパフォーマンスが得られる(おそらく開発モードで最も重要な)ため、本当に使用する必要があります。actioncontroller/base.rb
スニペットを含めていただきありがとうございます。コードを見て、謎のいくつかを取り除くのはいつでも素晴らしいことです。
clear_helpers
Rails 3.0でも引き続き有用ですconfig.action_controller.include_all_helpers = false
-Rails 3.1 以降のみです。
実際にRails 2では、ActionController :: Baseのデフォルト機能にはすべてのヘルパーが含まれていました。
チェンジセット6222(02/24/07 20:33:47(3年前)、dhh作成):すべてのヘルパーを常に(デフォルトで)必要とすることをデフォルトの仮定にします(そう、そう)
変化する:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
end
Rails 3ベータ1以降、変更ログに記載されているように、これは当てはまりません。