Почему все помощники 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]