Как следует иметь несколько действий с несколькими контроллерами, установить общую переменную экземпляра для использования в шаблонах, но после запуска действия.
Другими словами, я хочу, чтобы это работало в моем приложении_controller.
class ApplicationController < ActionController::Base
after_filter :set_something_common
def set_something_common
# All controllers' actions have queried the DB and set @foo for me...
@bar = some_calculation_on(@foo)
# ... and all templates expect @bar to bet set.
end
end
Этот не работает, потому что after_filter
запускается после рендеринга. Хорошо. Но каков правильный шаблон?
Опять же, важно, чтобы set_something_common
запускалось после действия, потому что эти действия делали конкретные вещи; но все они устанавливают @foo
.
Ни одна из моих идей не кажется идеальной:
- Вызовите
set_something_common()
в нижней части каждого действия, которое ему нужно. -
Рефакторинг кода конкретного контроллера в
case_specific_code()
и заставить их работать в порядке:before_filter :case_specific_code, :set_something_common
-
Подкласс
application_controller
и переопределите методindex
.
Любые мысли? Спасибо.
Изменить: ответ Мэтью заставил меня уточнить:
Несколько индексов указателей() все делают разбиение на страницы, каждый из которых принимает параметры @offset
и @limit
(через глобальный before_filter
) для просмотра срезов данных. Отлично. Теперь мне нужен общий метод для вычисления URL-адреса RESTful для ссылки "Следующий фрагмент". Мне было приятно видеть, что url_for()
генерирует URL-адрес, возвращающийся к тому же ресурсу, поэтому я попытался:
def set_something_common # really called set_next_url, truth be told
@next_url = url_for(:offset => @offset + @limit, :limit => @limit)
end
Я попытаюсь исправить FIXNUM, так что я могу сделать что-то вроде @offset.next_url_for(self, @limit)
из шаблона, но я не уверен, что он сработает. Подумайте об этом, если я собираюсь изменить шаблоны, я также могу настроить помощник приложения. Я все еще не уверен, какое лучшее решение.
Обновление: принятый ответ - "использовать помощника".
Спасибо за обновления от всех. Я выучил свой урок, что помощники, такие как глобальные переменные, существуют по какой-то причине и не должны избегать, когда они явно полезны и лаконичны.