将控制器动作放入线程

时间:2015-09-06 08:49:01

标签: ruby-on-rails multithreading

在阅读Running Rails jobs in background threads之后,我尝试重构一个控制器操作,该操作基本上以xml格式呈现报告,并将报告文件发送到用户浏览器。现在该动作运行c。 30秒,所以我认为这是一个很好的候选人。 Hovewer,我遇到了一个问题:似乎我无法从新线程中访问报告erb模板。

这是我对线程的第一次尝试,我不确定我是否能够通过该方法完成重构。

重构前的简化操作代码:

@orders = Order.onrange(range).includes(:logo => [:simulations, :pantones])
respond_to do |format|
  format.xml {
    orders_xml = render_to_string template: 'orders/bom'
    send_data orders_xml, filename: "BOM raport - #{range.to_s}.xml"
  }
end

1 个答案:

答案 0 :(得分:1)

我不知道您是否已经看过本指南:http://guides.rubyonrails.org/active_job_basics.html如果没有,请仔细查看。

根据您的描述,您可以通过以下方式实现目标:

  • 发出第一个请求,它将调用控制器操作来生成报告,并使用回调'after_perform'来使用生成的报告更新视图。
  • 从“询问报告”和“查看报告”中拆分报告。第一个将排队报告生成,一旦准备就绪,将在报告部分为用户提供。

如果你计划报告生成时间会增加,或者让用户等待30秒报告是不可接受的,我宁愿选择第二个选项。其他选项可能是在您拥有所需数据后生成报告,因此当用户要求它时,它已经生成。 (只是猜测,因为我不知道你的申请流程)