web-dev-qa-db-ja.com

なぜすべてのRailsヘルパーはすべてのビューで常に利用可能ですか?これを無効にする方法はありますか?

別のコントローラーのビューで1つのコントローラーのヘルパーメソッドにアクセスできるのはなぜですか? Railsをハッキング/パッチングせずにこれを無効にする方法はありますか?

89
Nate Smith

@George Schreiberのメソッドは、Rails 3.1;の時点では機能しません。コードは大幅に変更されました。

ただし、Rails 3.1(できれば後で))でこの機能を無効にするさらに良い方法があります。config/ application.rbに次の行を追加します。

config.action_controller.include_all_helpers = false

これにより、 ApplicationControllerがすべてのヘルパーをロードするのを防ぎます

(興味のある方は、 機能が作成されたプルリクエストはこちら です。)

105
Craig Walker

答えはRailsバージョン。

Rails> = 3.1

変更 include_all_helpers構成を適用するすべての環境でfalseに構成します。構成をすべての環境に適用する場合は、application.rb

config.action_controller.include_all_helpers = false

Falseの場合、 包含をスキップ になります。

Rails <3.1

ApplicationControllerから次の行を削除します

helper :all

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

98
Simone Carletti

In 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
27

実際に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に記載されているように、もはやそうではありません。

  • RailsでデフォルトのApplicationControllerに依存する代わりに、ActionController :: Baseがhelper:allを実行するようになりました[DHH]
5
databyte