我正在使用Ruby on Rails 3.1,我想知道(对于性能的原因)after_filter
是否在呈现视图文件之后运行。也就是说,当用户访问我的应用程序URL时,他/她应该显示的相关视图文件在after_filter
运行之前呈现,或after_filter
在呈现视图文件之前运行?< / p>
换句话说,应用程序服务器开始在运行after_filter
之前将呈现的视图数据发送给用户,或者它等待运行after_filter
方法,然后才发送该视图数据?
PS :我打开了这个问题因为我想运行一些系统更新( note :这些更新不会影响视图输出数据而不是&#34;&#34; /&#34;根本不需要视图,而不影响最终用户体验(例如:我的应用程序网页加载缓慢)。
答案 0 :(得分:12)
您必须知道对服务器的请求是完全一致的,并且在自己的线程中运行。
如果你把代码放在after_filter
中,这将延迟整个请求:总结得很糟糕,如果线程处于活动状态,页面就不会被传递。
这就是为什么你找到像DelayedJob
和Resque
这样的优秀插件的原因,它们可以在并行流程中运行,不会影响你的应用。
要回答原始问题,请在处理完视图后触发after_filter
。
这有时是一个麻烦,这就是people created some before_render
filters.
答案 1 :(得分:5)
after_filter
在内容生成后运行,但在发送到客户端之前运行。您可以验证这是因为您可以在任何after_filter中访问控制器的response
方法中完全生成的响应数据。
After_filters是放置长时间运行任务的不适当的地方,因为它们肯定会影响用户的体验。相反,请考虑使用after_filter启动长时间运行的delayed_job或resque任务,以执行后台工作。