3

我在 Ruby on Rails 中实现,我有 2 个视图。在我的第一个视图中,我读入一个文件并显示第一行(这很好),然后在我的第二个视图中(在控制器中的方法中)我写了一个临时文件。一样。我想再次显示这个临时文件的内容。但这不起作用,我总是得到错误:

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>

有人看到我做错了吗?提前致谢!

4

1 回答 1

3

AFAIK,一个 Tempfile 只会持续到你关闭它 - 然后它不再有效。如果您想将数据实际保存在关闭后仍然存在的文件中 - 那么您需要使用真实的文件。

编辑; 根据我们的讨论,我认为您根本不需要临时文件。您只是显示用户为您上传的部分文件数据。你不需要一个真正的文件对象(临时文件或其他)。

用户上传一个“文件”,您可以解析 CSV(如您所做的那样),然后您可以将其视为字符串数组。将其保存在像“@csv_lines”这样的@var 中,并在您的视图中访问数组@csv_lines,但您需要。

于 2011-11-16T12:15:42.270 回答