Upload CSV file in Rails and process records to display on page without saving file?

Horse Voice picture Horse Voice · Jan 7, 2013 · Viewed 17.8k times · Source

I am in the process of learning Rails and am trying to create a file upload page to process CSV data without any use of my database or model. I am also trying to avoid using any gems such as Paperclip or Carrier-wave.

I have made some progress, but for some reason, my code is not working. I don't get the records that are in the CSV file displayed on the import.html.erb page.

When I click the upload button on my page: localhost:3000/upload, it redirects me properly to the expected page after submission, but the rows from file don't appear.

Does anyone have a clue why the page is not displaying the records from the CSV file?

The upload file view (index.html.erb):

<%= form_tag({:action => :import}, multipart: true) do %>
  <%= file_field_tag :file %>
  <%= submit_tag( "Import" ) %>
<% end %>

The controller (upload_controller.rb):

class UploadController < ApplicationController
  def index
  end

  def import
    rowarray = Array.new
    myfile = params[:file]

    CSV.foreach(myfile.path) do |row|
      rowarray << row
      @rowarraydisp = rowarray
    end
  end
end

The result view (import.html.erb):

<% @rowarraydisp.each do |row| %>
  <%= row %>
<% end %>
<h1>File has been uploaded. Check</h1>

Answer

the Tin Man picture the Tin Man · Jan 7, 2013
CSV.foreach(myfile.path) do |row|
  rowarray << row
  @rowarraydisp = rowarray
end

should be written:

@rowarraydisp = CSV.read(myfile.path)

Per the documentation for CSV.read:

Use to slurp a CSV file into an Array of Arrays.

Your import.html.erb file is used twice, for two different examples of your ERB. What is the actual file, and the actual code?

<% @rowarraydisp.each do |row| %>
  <%= row %>
<% end %>

will try to send a sub-array row from the CSV file to the browser, but, without an idea what that ERB or data is it's hard to say what the output will be other than the contents of a row of data.