为什么我可以在另一个控制器的视图中访问一个控制器的辅助方法?有没有办法在不破解/修补 Rails 的情况下禁用它?
4 回答
@George Schreiber 的方法在 Rails 3.1 中不起作用;代码发生了重大变化。
然而,现在有一种更好的方法可以在 Rails 3.1 中禁用此功能(希望以后)。在您的 config/application.rb 中,添加以下行:
config.action_controller.include_all_helpers = false
这将阻止 ApplicationController 加载所有帮助程序。
(对于任何感兴趣的人,这里是创建该功能的拉取请求。)
答案取决于 Rails 版本。
导轨 >= 3.1
include_all_helpers
将配置更改为false
要应用配置的任何环境。如果您希望配置适用于所有环境,请将其更改为application.rb
.
config.action_controller.include_all_helpers = false
当为 false 时,它将跳过包含。
导轨 < 3.1
删除以下行ApplicationController
helper :all
这样,每个控制器都会加载自己的助手。
在 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
实际上在Rails 2中, ActionController::Base 的默认功能是包含所有帮助器。
Changeset 6222 on 02/24/07 20:33:47 (3 years ago) by dhh : 将其作为默认假设,即您始终需要所有帮助者(是的,是的)
改变:
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]