3

私は Ruby on Rails で実装しており、2 つのビューがあります。私の最初のビューでは、ファイルを読み込んで最初の行を表示し (これは正常に動作します)、次に 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は閉じるまでしか持続しません。その後、Tempfileは無効になります。データを閉じた後も残るファイルに実際にデータを保存したい場合は、実際のファイルを使用する必要があります。

編集; 私たちの議論によると、一時ファイルはまったく必要ないと思います。ユーザーがアップロードしたファイルデータの一部を表示しているだけです。そのための実際のファイルオブジェクト(tempfileなど)は必要ありません。

ユーザーが「ファイル」をアップロードすると、CSVを(実行したとおりに)解析できます。その後、それを文字列の配列として扱うことができます。「@csv_lines」のような@varに保存し、ビューで配列@csv_linesにアクセスします。

于 2011-11-16T12:15:42.270 に答える