2012-02-24 2 views
17

Я использую Ruby on Rails 3.1, и я хотел бы знать (для performance причинам) независимо от того, запускается ли после этого просмотр файлов after_filter. То есть, когда пользователь обращается к URL-адресу моего приложения, соответствующий файл представления, который он/она должен отображать, отображается перед тем, как запускается after_filter, или after_filter работает до того, как будет отображаться файл представления?Как работает/работает «after_filter»?

Других слов, на сервере запуска приложения для отправки, оказываемые данные представлений пользователя, прежде чем запустить after_filter или она ожидает, чтобы запустить метод after_filter и только после этого он посылает эту точка зрения данных?

P.S.: Я открыл этот вопрос, потому что хотел бы запустить некоторые системные обновления (примечание: эти обновления не влияют на выходные данные представления и не используются «/» обязательно для просмотра вообще) без воздействия на опыт конечного пользователя (например: медленная загрузка веб-страниц приложения).

ответ

11

Вы должны знать, что запрос на ваш сервер полностью согласован и работает в своем потоке.

Если вы поместите код в after_filter, это задержит весь запрос: подвести итог плохо, если поток жив, страница не доставляется.

Именно поэтому вы найдете отличные плагины, такие как DelayedJob и Resque, они работают в параллельных процессах и не будут влиять на ваше приложение.


Чтобы ответить на ваш первоначальный вопрос, after_filter срабатывает после того, как был обработан.

Это иногда хлопот, поэтому people created some before_render filters.

5

after_filter запускается после того, как содержание было сгенерировано, но, прежде чем он был отправлен клиенту. Вы можете проверить это, потому что у вас есть доступ к полностью сгенерированным данным ответа в методе response вашего контроллера в любом файле after_filter.

After_filters - неподходящие места для выполнения задач, выполняемых в течение длительного времени, поскольку они определенно влияют на опыт пользователей. Вместо этого используйте after_filter, чтобы запустить длинную задачу delayed_job или resque вместо выполнения фоновой работы.

Смежные вопросы