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