Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:在控制器操作之间传递大量数据_Ruby On Rails - Fatal编程技术网

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

Ruby on rails Rails:在控制器操作之间传递大量数据,ruby-on-rails,Ruby On Rails,我有一个具有三个操作的控制器:index、iframe和result。其工作方式是用户通过GET请求访问索引操作。这将呈现包含表单的视图。表单只是一个按钮,可以发布到result。我的result操作只是呈现一个包含jQuery进度条和iframe的页面,其内容是iframe操作。iframe操作执行一些长时间运行的处理,并最终将结果返回到result视图。(我需要在iframe中执行此操作的全部原因是,结果操作会以进度条快速返回,因此用户不会认为应用程序崩溃。) 以前,表单仅由一个按钮组成,该

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

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


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

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

我在这里对您的系统的用途做一些假设,但以下是我要做的:

我会上传文件并将其存储在文件系统中,还将在数据库表中创建一条新记录,指示文件在系统中的位置,以及文件是否已“处理”。您可以使用载波gem进行以下操作:

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

在这一点上,从最终用户的角度来看,流程的顺利程度基本上取决于您。最简单的情况是:

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


一种更复杂的方法是:一旦显示“job has added to the queue”(作业已添加到队列)页面,您可以显示一个计时器,计算它已被添加了多长时间,并使用javascript计时器每隔几秒钟定期向服务器发出AJAX请求,以检查作业是否已完成。作业完成后,使用AJAX更新页面,以表明您正在处理服务器端还是客户端?服务器端。我想出了一个(临时)解决方案,将上传的文件保存到一个新文件中,然后通过
会话[:something]=“tmp/my_new_file.zip”