2012-02-24 53 views
17

我正在使用Ruby on Rails 3.1,并且我想知道(对于性能原因)after_filter是否在该视图文件呈现后运行。也就是说,当用户访问我的应用程序URL时,他/她应该显示的相关视图文件在after_filter运行或after_filter运行之前就会呈现视图文件?'after_filter'如何/何时运行?

换句话说应用服务器开始渲染视图数据发送到用户之前运行after_filter或它等待运行after_filter方法,然后才将其发送该视图的数据?

P.S.:我打开这个问题是因为我想运行一些系统更新(注意:这些更新不会影响视图输出数据,并且不会被“/”用于“视图所必需的”),而不会影响到最终用户体验(例如:缓慢加载我的应用程序网页)。

回答

11

您必须意识到,对您的服务器的请求是完全一致的,并在其自己的线程中运行。

如果您将代码放在after_filter中,这会延迟整个请求:总结不好,如果线程处于活动状态,则不会传递页面。

这就是为什么你会发现很棒的插件,如DelayedJobResque,它们在并行进程中工作,不会影响你的应用程序。


要回答您的原始问题,请在视图处理后触发after_filter

这有时是件麻烦事,这就是为什么已经产生了内容之后people created some before_render filters.

5

after_filter运行,但在此之前它被发送到客户端。您可以验证这是因为您可以在任何after_filter中访问控制器的response方法中完全生成的响应数据。

After_filters是不适合放置长时间运行的任务的地方,因为它们肯定会影响用户的体验。请考虑使用after_filter启动长时间运行的delayed_jobresque任务,以改为执行后台工作。