91

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

4

4 回答 4

107

@George Schreiber 的方法在 Rails 3.1 中不起作用;代码发生了重大变化。

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

config.action_controller.include_all_helpers = false

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

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

于 2011-09-28T21:34:00.870 回答
99

答案取决于 Rails 版本。

导轨 >= 3.1

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

config.action_controller.include_all_helpers = false

当为 false 时,它​​将跳过包含

导轨 < 3.1

删除以下行ApplicationController

helper :all

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

于 2009-07-24T20:08:03.150 回答
27

在 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::Baseclear_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
于 2010-11-17T12:58:40.790 回答
5

实际上在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]
于 2010-05-07T03:46:47.470 回答