Rails:在控制器操作之间传递大量数据

时间:2014-10-06 20:53:50

标签: ruby-on-rails

我有一个包含三个操作的控制器:indexiframeresult。它的工作方式是用户通过GET请求访问index操作。这将呈现包含表单的视图。表单只是一个POST到result的按钮。我的result操作只是呈现包含jQuery进度条和iframe的页面,其内容为iframe操作。 iframe操作执行一些长时间运行的处理,最终将结果返回到result视图。 (我需要在iframe中执行此操作的全部原因是result操作快速返回进度条,因此用户不认为应用程序崩溃。)

以前,表单只包含一个发布到result的按钮。在这种情况下,iframe操作从静态URL下载~100MB文件并对其进行一些处理,然后使用处理结果更新父页面(result)。

现在我需要提供上传文件进行处理的选项,而不是始终使用静态URL进行下载。基本上,如果用户提供文件,请使用该文件;否则,请使用静态URL。我修改了我的表单以接受文件上传,这部分工作正常。我的问题是如何将这个上传的文件(大约100MB)从result传递到iframe。这个会议太大了。上传的文件不需要在运行之间保存。

1 个答案:

答案 0 :(得分:0)

除了实施细节之外,您还应该通过更多问题的背景更新您的问题 - 您上传了哪种文件?你做什么样的处理?从最终用户的角度来看,该系统的目的是什么?它可以帮助人们理解您尝试解决的问题。

我在这里对你的系统的目的做了一些假设,但这就是我要做的事情:

我上传文件并将其存储在文件系统中,并在数据库表中创建一条新记录,指示文件在系统中的位置,以及文件是否经过处理" ;或不。您可以使用Carrier Wave gem:https://github.com/carrierwaveuploader/carrierwave

然后我会使用某种后台作业工具来进行实际处理。因此,当文件上传时,您将其添加到要处理的东西的队列中,然后向用户返回一条消息,说明"该作业已添加到队列中进行处理,即将完成"。您在数据库表中保存的行的ID可以作为需要处理该文件的标识符。处理完毕后,您需要更新"已处理的"数据库中的列为true。在背景工作方面有几种宝石可供选择 - 一种流行的是SideKiq - http://sidekiq.org/

此时,根据您希望从最终用户的角度制定流程的顺畅程度,它基本取决于您。最简单的情况是:

当您返回消息&#34时,作业已添加到队列中进行处理,并将很快完成,"你也可以说"它应该在几分钟内完成。刷新此页面以查看您的工作是否完整"。每次刷新,如果处理完成,您都可以让他们知道。

更复杂的方法是:将一个"作业添加到队列后#34;如果显示页面,您可以显示一个计时器,计算它已经存在的时间,并使用javascript计时器每隔几秒定期向服务器发出AJAX请求,以检查作业是否已完成。作业完成后,使用AJAX更新页面以指示该作业。

相关问题