从新创建的TempFile中读取数据无法工作?在Ruby on Rails中IOError关闭了流。

3
我正在使用Ruby on Rails实现,有两个视图。在我的第一个视图中,我读取文件并显示前几行(这个部分没有问题),然后在我的第二个视图(在控制器的方法中)中,我写入了一个临时文件。仅仅是相同的操作。我想再次显示这个临时文件的内容。但是这不起作用,我总是收到错误消息:
IOError in Project importerController#result

closed stream

这是我的控制器中的代码,紧随第一个视图之后:

 tmpfile = Tempfile.new("tempfile")
    if tmpfile     
      tmpfile.write(@samples)
      tmpfile.close
      tmpfilename = File.basename(tmpfile.path)
      tmpfilenametest = tmpfilename
      if !$tmpfiles
        $tmpfiles = Hash.new
      end
      $tmpfiles[tmpfilename] = tmpfile
    else
      flash[:error] = "Cannot save import file."
      return
    end
    @path = tmpfile.path
    session[:importer_tmpfile] = tmpfilename
   end 

在我的下一个视图中,我想通过以下方式读取此文件:

 tmpfilename = session[:importer_tmpfile]
      i = 0
      sample_count = 5

      if tmpfilename
      tmpfile = $tmpfiles[tmpfilename]
      if tmpfile == nil
        flash[:error] = "Tijdelijk bestand bestaat niet!"
        return
      end
    end


    fields_map = params[:fields_map]
      attrs_map = fields_map.invert

      @parsed_tempfile=CSV::Reader.parse(tmpfile)
       @sampletemp = []
     @parsed_tempfile.each  do |row| 

          @sampletemp[i] = row  

        i = i+1  

     end

在这个视图中,我只想展示它,我只有:
<ul>
<% @sampletemp.each do |x| %>
<li>
<%= x %>
</li>
<% end %>
</ul>

有人看到我做错了什么吗?提前感谢!
1个回答

3
据我所知,Tempfile只在关闭之前有效,一旦关闭,它就不再有效。如果您想在关闭后实际保存数据到文件中,那么您需要使用真实的File。
编辑: 根据我们的讨论,我认为您根本不需要tempfile。您只是在显示用户为您上传的文件数据的部分内容。您不需要一个真正的文件对象来完成这个任务(无论是tempfile还是其他什么)。
用户上传一个"文件",然后您可以解析CSV文件(就像您已经做过的那样),然后将其保存在@var中,如"@csv_lines"。在视图中,您可以按照需要访问@csv_lines数组。

那我需要删除 tmpfile.close 吗? - user1027319
不,那样行不通。如果你想在切换到另一个视图时保留文件...那么你必须使用真正的文件。真正地保存它,并在另一个视图中打开它。至少这是我理解你试图做的事情。 - Taryn East
否则 - 你能否更详细地解释一下你对这个文件的操作?你是如何获取它的?你想要用它做什么?它只是一个文件名,还是一个上传的文件,或者是保存在你的系统上的文件... - Taryn East
我只希望在第一个视图中,用户可以浏览文件。这将通过params[:file]传递给控制器,然后在第二个视图中,我显示CSV文件的前几行,然后在第三个视图中再次显示相同的内容。这看起来很愚蠢,但这只是个想法。所以如果我理解正确的话,您是说我只需要创建一个文件,类似于用户选择的文件的副本。然后使用该文件进行操作? - user1027319
1
当然。非常抱歉,我的做法很愚蠢。非常感谢你的帮助! - user1027319
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接