如何在两个操作之间保留临时文件

时间:2013-11-27 16:57:56

标签: ruby-on-rails

我的应用程序在Heroku上,我正在通过导入Excel创建资源

我的应用的用户可以从Excel电子表格导入联系人。进行导入的过程有多个步骤,使用户的大脑更容易。在第一步中,他们上传文件(电子表格)。在第二步中,他们选择一些选项来处理文件。这两个步骤不能组合成一个,因为选项取决于文件的标题。

现在,这是以两个动作完成的:一个用于上传文件的POST,另一个用于上传用户选择的POST。该文件作为Tempfile实例化,不会在操作中保持不变。

因此,我不希望用户在中间操作中再次上传第一个文件。这可能吗?

第一步:

= simple_form_for [:choose_headers, @contact_import] do |f|
  = f.input :file, as: :file
  = f.submit

在第二步中,文件不会保留:

= simple_form_for [@contact_import] do |f|
  = f.input :file, as: :file
  = f.input :some_other_input
  = f.submit

1 个答案:

答案 0 :(得分:3)

请勿使用Tempfile。为上载的数据生成您自己的唯一文件名,并将文件保存在特殊目录中。 (如果您使用Capistrano进行部署,我会在生产中部署时将上传目录放在shared下。在config/deploy.rb中,我会添加一个部署挂钩,如果它尚未创建上传目录然后我会使用config/environments/production.rbconfig/environments/development.rb中的配置值指定上传目录的相对路径,所以一切都在开发和生产中无缝地工作。在我的控制器操作中,我会做类似的事情File.join(Rails.root, UPLOAD_PATH, filename)为上传的文件构建正确的路径。)

将生成的文件名保存在数据库中,并在用户返回第二步时检索它。此外,添加自定义rake任务,清除从未使用过的旧上传,并在生产中从cron作业运行该任务。 (我建议使用whenever gem来配置cron个工作。)