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”