为什么我可以在其他控制器的视图中访问一个控制器的帮助器方法?有没有一种方法可以禁用此功能而无需修改/修补Rails?
Answers:
从Rails 3.1开始,@ George Schreiber的方法无效。代码已发生重大变化。
但是,现在有一种更好的方法可以在Rails 3.1中禁用此功能(并且希望以后再使用)。在您的config / application.rb中,添加以下行:
config.action_controller.include_all_helpers = false
这将防止ApplicationController加载所有帮助程序。
(对于任何有兴趣的人,这是创建功能的请求请求。)
答案取决于Rails版本。
在要应用配置的任何环境中将include_all_helpers
config 更改为false
。如果要将配置应用于所有环境,请在中进行更改application.rb
。
config.action_controller.include_all_helpers = false
如果为false,则将跳过包含。
从中删除以下行 ApplicationController
helper :all
这样,每个控制器将加载其自己的助手。
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的默认功能是包括所有帮助器。
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中所述: