Чому всі помічники Rails постійно доступні для всіх переглядів? Чи є спосіб вимкнути це?


89

Чому я можу отримати доступ до допоміжних методів для одного контролера у поданнях для іншого контролера? Чи є спосіб вимкнути це без злому / виправлення Rails?


3
Є нова, більш відповідна відповідь. Перевірте відповідь Крейга Уокера
EE33,

Відповіді:


106

Метод @George Schreiber не працює на Rails 3.1; код суттєво змінився.

Однак зараз є ще кращий спосіб вимкнути цю функцію в Rails 3.1 (і, сподіваємось, пізніше). У своєму config / application.rb додайте цей рядок:

config.action_controller.include_all_helpers = false

Це не дозволить ApplicationController завантажувати всі помічники .

(Для всіх, хто цікавиться, ось запит на витягування, де ця функція була створена .)


Я на 3.2. Чи означає application.config тут config / application.rb?
Брендон Генрі,

Чи буде включено ApplicationHelper також, якщо я відключу include_all_helpers або мені потрібно включити його вручну?
Роберт Ауді

@AzizLight Я не впевнений, оскільки я не тестував цього. Однак я сподівався б на це, оскільки ApplicationHelper має бути завжди доступним у поданнях як "кореневий" помічник. Тут першочерговими є помічники з не пов’язаних між собою контролерів.
Крейг Уолкер

3
Я думаю, це має бути поведінкою за замовчуванням.
Нафаа Бутефер

98

Відповідь залежить від версії Rails.

Рейки> = 3.1

Змініть include_all_helpersконфігурацію на falseбудь-яке середовище, де ви хочете застосувати конфігурацію. Якщо ви хочете, щоб конфігурація застосовувалася до всіх середовищ, змініть її в application.rb.

config.action_controller.include_all_helpers = false

Якщо встановити значення false, воно пропустить включення .

Рейки <3.1

Видаліть наступний рядок з ApplicationController

helper :all

Таким чином кожен контролер завантажує своїх власних помічників.


2
Цей рядок не існує для мене в Rails 3.2, тому це рішення, ймовірно, більше не застосовується до пізніших версій Rails.
Тайлер Коллер,

Що сказав @TylerCollier!
EE33,

Мені буде цікаво, чому це настільки суттєво змінилося з Rails до версії 3.1? Не має для мене особливого сенсу.
Джошуа Мухайм

6
ПРИМІТКА: Наведені вище коментарі більше не дійсні, тепер, коли відповідь оновлена, включаючи Rails> 3.1
Kyle Heironimus

3
Примітка: Ваш ApplicationHelper все одно буде завантажений. Якщо ви хочете постійно включати певних помічників, ви можете додати include HelperNameу верхню частину вашого ApplicationHelper.
vansan

27

У 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

10
На той час, коли ви зателефонуєте, 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 і вище.
robd

5

Насправді в 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:

  • Додано, що ActionController :: Base тепер робить помічник: все замість того, щоб робити це за допомогою типового ApplicationController у Rails [DHH]

1
так що це означає в Rails 3, що всі помічники за замовчуванням постійно завантажуються?
Nik So

@Nik, безумовно, так, принаймні для 3.2
Нітін,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.