Почему я могу получить доступ к вспомогательным методам для одного контроллера в представлениях для другого контроллера? Есть ли способ отключить это без взлома / исправления Rails?
Ответы:
Метод @George Schreiber не работает с Rails 3.1; код существенно изменился.
Однако теперь есть еще лучший способ отключить эту функцию в Rails 3.1 (и, надеюсь, позже). В вашем config / application.rb добавьте эту строку:
config.action_controller.include_all_helpers = false
Это предотвратит загрузку ApplicationController всех помощников .
(Для всех, кому интересно, вот пул реквест, в котором функция была создана .)
Ответ зависит от версии Rails.
Измените include_all_helpers
конфигурацию на false
любую среду, в которой вы хотите применить конфигурацию. Если вы хотите, чтобы конфигурация применялась ко всем средам, измените ее в application.rb
.
config.action_controller.include_all_helpers = false
Если установлено значение false, включение будет пропущено .
Удалите следующую строку из ApplicationController
helper :all
Таким образом, каждый контроллер загрузит своих помощников.
include HelperName
в начало своего ApplicationHelper.
В 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
clear_helpers
(производительность), ущерб уже был нанесен, поскольку все помощники были загружены. Вы действительно хотите использовать config.action_controller.include_all_helpers = false
(как заявляет @Craig Walker выше), поскольку он в первую очередь предотвращает загрузку помощников, тем самым повышая производительность (возможно, наиболее существенно в режиме разработки). Благодарим за actioncontroller/base.rb
добавление фрагмента. Всегда приятно увидеть код и избавиться от тайны.
clear_helpers
еще пригодится для рельсов 3.0 - config.action_controller.include_all_helpers = false
это только рельсы 3.1 и выше.
Фактически в 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: