9

解析/アクション/などのために JSON ファイルを読み込もうとしているフォームがあります。コントローラーで読み取るのに問題があります。

意見:

<%= form_tag({:controller => :admins, :action => :upload_json}, {:multipart => true, :method => :post}) do |f| %>

    <%= file_field_tag 'datafile' %>

<%= submit_tag "Upload" %>

コントローラ:

def upload_json

  file_data = params[:datafile]

  File.read(file_data) do |file|

     file.each do |line|
       ## does stuff here....
     end
  end

end

データをシードしているときに、ファイルで同様の関数が機能しseed.rbます-アップロードされたファイルで読み取ることができません。

私が得ているエラーは次のとおりcan't convert ActionDispatch::Http::UploadedFile into Stringです。

助けてくれてありがとう!

4

3 に答える 3

23

理解した。変更が必要:

file_data = params[:datafile]

file_data = params[:datafile].tempfile

そして、.open関数を使用して変更することにしました:

File.read(file_data) do |file|

File.open(file_data, 'r') do |file|  
于 2012-09-25T20:10:55.150 に答える
2

を使用して、アップロードされたファイルを開きますpath

params[:datafile]はクラスのインスタンスであり、適切に処理するためにActionDispatch::Http::UploadedFile呼び出して、保存されたファイルを取得する必要があります。path

さらに、File.read探している行ごとの処理が得られません。に変更する必要がありますFile.open

これを試して:

コントローラ

def upload_json

  uploaded_datafile = params[:datafile]

  File.open( uploaded_datafile.path ) do |file|

     file.each_line do |line|

       # Do something with each line.

     end

  end

end

別のスタイル

def upload_json

  File.foreach( params[:datafile].path ) do |line|

    # Do something with each line.

  end 

  # FYI: The above method block returns `nil` when everything goes okay.

end
于 2015-07-02T14:53:19.653 に答える
2

params[:datafile] は ActionDispatch::Http::UploadedFile クラスのインスタンスで、tempfile が添付されています。tempfile を開くには

あなたは次のようなことを試します

File.open(params[:datafile].path) do |file|
 #your stuff goes here
end
于 2012-09-25T20:12:43.847 に答える