Как иметь несколько разных действий контроллера для установки общей переменной экземпляра для использования в шаблонах , но после выполнения действия .
Другими словами, я хочу, чтобы это работало в моем application_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
.
Есть мысли? Спасибо.
Редактировать: ответ Мэтью побудил меня уточнить:
Все несколько контроллеров 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)
из шаблона, но я не уверен, будет ли это работать. Если подумать, если я собираюсь изменить шаблоны, я могу также настроить помощника приложения. Я до сих пор не уверен, какое решение лучше.
Обновление: принят ответ "использовать помощника".
Спасибо за обновления от всех. Я усвоил урок, что помощники, такие как глобальные переменные, существуют по какой-то причине, и их не следует избегать, когда они явно полезны и лаконичны.