为什么所有时间都可以使用所有Rails帮助器?有办法禁用它吗?


89

为什么我可以在其他控制器的视图中访问一个控制器的帮助器方法?有没有一种方法可以禁用此功能而无需修改/修补Rails?


3
有一个新的,更相关的答案。看看Craig Walkers的答案
EE33 2012年

Answers:


106

从Rails 3.1开始,@ George Schreiber的方法无效。代码已发生重大变化。

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

config.action_controller.include_all_helpers = false

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

(对于任何有兴趣的人,这是创建功能的请求请求。)


我在3.2。这里的application.config表示config / application.rb吗?
布兰登·亨利

如果我禁用include_all_helpers或需要手动将其包括在内,ApplicationHelper是否也将包括在内?
罗伯·奥迪

@AzizLight我不确定,因为我尚未测试。但是,我希望如此,因为ApplicationHelper旨在始终作为“根”助手在视图中可用。在这里,主要的问题是无关的控制器的助手。
Craig Walker

3
我认为这应该是默认行为。
纳法阿·布特弗

98

答案取决于Rails版本。

导轨> = 3.1

在要应用配置的任何环境中将include_all_helpersconfig 更改为false。如果要将配置应用于所有环境,请在中进行更改application.rb

config.action_controller.include_all_helpers = false

如果为false,则将跳过包含

导轨<3.1

从中删除以下行 ApplicationController

helper :all

这样,每个控制器将加载其自己的助手。


2
Rails 3.2中不存在此行,因此此解决方案可能不再适用于更高版本的Rails。
Tyler Collier 2012年

@TylerCollier说什么!
EE33 2012年

我会对为什么从Rails up 3.1版起如此大的变化感兴趣?对我来说没有多大意义。
约书亚·穆海姆

6
注意:上面的评论不再有效,因为答案已经更新为包括Rails> 3.1
Kyle Heironimus 2012年

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_helpers对于rails 3.0仍然有用- config.action_controller.include_all_helpers = false仅在rails 3.1及更高版本中。
2014年

5

实际上,在Rails 2中,ActionController :: Base的默认功能是包括所有帮助器。

dhh在02/24/07 20:33:47(3年前)上的Changeset 6222:默认假设您一直想要所有助手(是,是)

更改:

class ApplicationController < ActionController::Base 
  helper :all # include all helpers, all the time 
end 

从Rails 3 beta 1开始,情况不再如此,如CHANGELOG中所述:

  • 添加了ActionController :: Base现在可以执行helper:all,而不是依靠Rails中的默认ApplicationController来完成它[DHH]

1
难道这意味着在Rails 3中,默认情况下所有助手都在所有时间加载吗?
Nik So

@Nik肯定是的,至少3.2
Nithin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.