なぜすべての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は常に「ルート」ヘルパーとしてビューで使用できるように設計されているため、そうなると思います。ここで主な問題となるのは、無関係なコントローラーのヘルパーです。
クレイグウォーカー

3
これはデフォルトの動作であると思います。
Nafaa Boutefer

98

答えはRailsのバージョンによって異なります。

Rails> = 3.1

変更include_all_helpersへの設定をfalse使用すると、設定を適用したい任意の環境で。構成をすべての環境に適用する場合は、で変更しapplication.rbます。

config.action_controller.include_all_helpers = false

falseの場合、組み込みスキップされます。

Rails <3.1

次の行を削除します ApplicationController

helper :all

このようにして、各コントローラーは独自のヘルパーをロードします。


2
この行はRails 3.2には存在しないため、このソリューションはおそらくRailsの新しいバージョンには適用されません。
タイラーコリアー2012

@TylerCollierが言ったこと!
EE33

これがRailsのバージョン3.1から大幅に変更された理由に興味がありますか?私にはあまり意味がありません。
Joshua Muheim、2012年

6
注:上記のコメントは無効になりました。回答がRails> 3.1
Kyle Heironimus

3
注:ApplicationHelperは引き続き読み込まれます。特定のヘルパーを常に含めたい場合include HelperNameは、ApplicationHelperの先頭に追加できます。
vansan 2013年

27

Rails 3ではactioncontroller/base.rb(224行目あたり):

def self.inherited(klass)
  super
  klass.helper :all if klass.superclass == ActionController::Base
end

つまり、クラスをから派生した場合ActionController::Base、すべてのヘルパーが含まれます。

これを回避するには、コントローラーのコードの先頭でclear_helpersAbstractClass::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

10
clear_helpersすべてのヘルパーがロードされているので、(パフォーマンス)コールを呼び出すときまでに、ダメージはすでに行われています。config.action_controller.include_all_helpers = false(上記の@Craig Walkerの状態のように)ヘルパーが最初にロードされるのを防ぎ、ある程度のパフォーマンスが得られる(おそらく開発モードで最も重要な)ため、本当に使用する必要があります。actioncontroller/base.rbスニペットを含めていただきありがとうございます。コードを見て、謎のいくつかを取り除くのはいつでも素晴らしいことです。
ジョージアンダーソン

clear_helpersRails 3.0でも引き続き有用ですconfig.action_controller.include_all_helpers = false-Rails 3.1 以降のみです。
robd 2014年

5

実際に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以降、変更ログに記載されているように、これは当てはまりません。

  • ActionController :: BaseがRailsのデフォルトのApplicationControllerに依存する代わりにヘルパー:allを実行するようになったことを追加[DHH]

1
Rails 3では、デフォルトですべてのヘルパーが常にロードされますか?
Nik So

@Nik確かにそうです、少なくとも3.2
Nithin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.