Почему все помощники Rails доступны для всех просмотров все время? Есть ли способ отключить это?

Почему я могу получить доступ к вспомогательным методам для одного контроллера в представлениях для другого контроллера? Есть ли способ отключить это без взлома/исправления Rails?

Ответ 1

Метод George Schreiber не работает с Rails 3.1; код значительно изменился.

Однако теперь есть еще лучший способ отключить эту функцию в Rails 3.1 (и, надеюсь, позже). В config/application.rb добавьте следующую строку:

config.action_controller.include_all_helpers = false

Это будет запретить загрузке всех помощников ApplicationController.

(Для всех, кто заинтересован, здесь запрос на растяжение, где была создана функция.)

Ответ 2

Ответ зависит от версии Rails.

Rails >= 3.1

Измените конфигурацию include_all_helpers на false в любой среде, где вы хотите применить конфигурацию. Если вы хотите, чтобы конфигурация применима ко всем средам, измените ее на application.rb.

config.action_controller.include_all_helpers = false

Если false, то пропустить включение.

Rails < 3.1

Удалите следующую строку из ApplicationController

helper :all

Таким образом, каждый контроллер будет загружать собственные помощники.

Ответ 3

В 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

Ответ 4

На самом деле в 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 

В Rails 3 beta 1 это уже не так, как указано в CHANGELOG:

  • Добавил, что ActionController:: Base теперь выполняет хелпер: все вместо того, чтобы полагаться на стандартный ApplicationController в Rails, чтобы сделать это [DHH]