Ruby-on-Rails中冗长的操作

时间:2014-09-09 12:47:03

标签: ruby-on-rails ruby

我面对以下情况。

用户单击链接以生成文本或XML。我的控制器中有一个方法generateXMLfile,它从db表中读取数据并创建一个哈希或数组。完成阅读和创建后,我使用send_file方法发送数据。

文件生成过程可能需要5到25秒(大数据),所以我想要做的是在处理请求时显示“请等待”消息并等待gif动画,并显示成功成功完成后的信息。

我知道如何实现类似的操作,例如,使用纯AJAX进行文件上传,但我不知道如何在Rails中执行此操作。

有没有人处理过类似的问题?执行此操作的最佳实践或Rails方法是什么?有什么建议或建议吗?

更新

def generateXMLfile

    #lengthy operation
    (1..100000000).each do 
    end

    sample_string = "This is a sample string\ngenerated by generateXML method.\n\n   Bye!"

    send_data sample_string, 
            :type => 'charset=utf-8; header=present', 
            :disposition => "attachment; filename=sample.txt"
  end        

2 个答案:

答案 0 :(得分:1)

你可以使用UJS绑定这样的调用。

<%= link_to "send file",generateXMLfile_path, :remote => true, :id => "send_file" %>

$('#send_file').bind('ajax:beforeSend', function() {
  $('#please wait').show();
});

$('#send_file').bind('ajax:complete', function() {
  $('#please_wait').hide();
  $('flash').show();
});

您也可以使用generateXMLfile.js.erb进行完整操作。

答案 1 :(得分:1)

请求5-25秒不是一个好主意。 当多个用户同时开始上载文件时,它可以使您的应用程序无响应。或者您可以在Web服务器上达到超时限制。 你应该使用一些后台处理工具,这里有一些选项:

延迟工作是最简单的工作,Sidekiq和Resque有点复杂,他们要求你安装Redis。

当后台处理完成后,您可以使用一些基于Websocket的工具向您的前端发送消息。 Pusher(http://pusher.com/)就是其中一种工具。