Чому я можу отримати доступ до допоміжних методів для одного контролера у поданнях для іншого контролера? Чи є спосіб вимкнути це без злому / виправлення 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 мала включати всіх помічників.
Changeset 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: