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

Почему я могу получить доступ к вспомогательным методам для одного контроллера в представлениях для другого контроллера? Есть ли способ отключить это без взлома / исправления 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

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

Рельсы < 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 заключалась в том, чтобы включать всех помощников.

Набор изменений 6222 от 24.02.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]
Другие вопросы по тегам