为什么所有Rails帮助程序始终可用于所有视图?有没有办法禁用它?

Nat*_*ith 89 ruby ruby-on-rails helpers

为什么我可以在视图中为不同的控制器访问一个控制器的辅助方法?有没有办法在没有黑客攻击/修补Rails的情况下禁用它?

Cra*_*ker 105

@George Schreiber的方法不适用于Rails 3.1; 代码发生了重大变化.

但是,现在有一种更好的方法可以在Rails 3.1中禁用此功能(希望稍后).在config/application.rb中,添加以下行:

config.action_controller.include_all_helpers = false
Run Code Online (Sandbox Code Playgroud)

这将阻止ApplicationController加载所有帮助程序.

(对于任何感兴趣的人,这是创建功能的拉取请求.)

  • 我认为这应该是默认行为。 (2认同)

Sim*_*tti 98

答案取决于Rails版本.

Rails> = 3.1

include_all_helpers配置更改为false要应用配置的任何环境.如果要将配置应用于所有环境,请将其更改为application.rb.

config.action_controller.include_all_helpers = false
Run Code Online (Sandbox Code Playgroud)

如果为false,则会跳过包含.

Rails <3.1

从中删除以下行 ApplicationController

helper :all
Run Code Online (Sandbox Code Playgroud)

这样每个控制器都会加载自己的帮助器.

  • 注意:上面的注释不再有效,现在答案已更新为包含Rails> 3.1 (6认同)
  • 注意:仍将加载您的ApplicationHelper.如果您希望始终包含任何特定的帮助程序,可以在ApplicationHelper的顶部添加"include HelperName". (3认同)
  • 我在Rails 3.2中不存在这一行,因此该解决方案可能不再适用于更高版本的Rails. (2认同)

小智 27

在Rails 3中,actioncontroller/base.rb(在224行左右):

def self.inherited(klass)
  super
  klass.helper :all if klass.superclass == ActionController::Base
end
Run Code Online (Sandbox Code Playgroud)

所以是的,如果你派出你的班级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.
Run Code Online (Sandbox Code Playgroud)

例如:

class ApplicationController < ActionController::Base
  clear_helpers
  ...
end
Run Code Online (Sandbox Code Playgroud)

  • 当您调用`clear_helpers`时,由于已经加载了所有帮助程序,因此已经完成(性能)损坏.你真的想使用`config.action_controller.include_all_helpers = false`(如上面的@Craig Walker所述),因为它可以防止首先加载助手,从而获得一些性能(在开发模式下可能最重要) .感谢您加入`actioncontroller/base.rb`片段; 看到代码并删除一些谜团总是很好. (10认同)

dat*_*yte 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 
Run Code Online (Sandbox Code Playgroud)

从Rails 3 beta 1开始,不再是CHANGELOG中提到的情况:

  • 补充说ActionController :: Base现在做了帮助:所有而不是依赖Rails中的默认ApplicationController来做它[DHH]