Почему я могу получить доступ к вспомогательным методам для одного контроллера в представлениях для другого контроллера? Есть ли способ отключить это без взлома / исправления Rails?
ruby-on-rails
ruby
helpers
Нейт Смит
источник
источник
Ответы:
Метод @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
Если установлено значение false, включение будет пропущено .
Рельсы <3.1
Удалите следующую строку из
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:
источник