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