Pergunta

When I want to select a file via file_field, it gives me the error that my file is 'nil'. Here's the error: "No such file or directory - Book1.csv"

May I know why? Below are the codes:

controller

def import_csv
@list = List.find(params[:list_id])
@lists = List.all

respond_to do |format|

@csv_text = File.read(params[:list][:file])
@csv = CSV.parse(@csv_text, :headers => true)
@n=0
@csv.each do | row |
  @user_new = User.new
  @user_new.first_name = row[0]
  @user_new.last_name = row[1]
  @user_new.email = row[2]
  @user_new.company = row[3]
  @user_new.address = row[4]
  @user_new.city = row[5]
  @user_new.state = row[6]
  @user_new.zipcode = row[7]
  @user_new.country = row[8]
  @user_new.notes = row[9]
  @user_new.birthday = row[10]
  @user_new.home_number = row[11]
  @user_new.mobile_number = row[12]
  @user_new.list_id = @list.id
  @user_new.save

  @list.subscribers += 1
  @list.save
  @n=@n+1
  GC.start if @n%50==0
  flash[:notice] = "CSV Imported Successfully, with  #{@n} records"                                
end

  format.html { redirect_to lists_url }
  format.json { head :no_content }
end
  end

view

<%= form_for(:list, :url => list_import_csv_path(@list), :method => :get, :html => {:multipart => true}) do |f| %>
 <table>
    <tr>
        <td><label for="dump_file">Select a CSV File :</label></td>
        <td><%= f.file_field :file %></td>
    </tr>
    <tr>
        <td colspan='2'><%= submit_tag 'Import from CSV file' %></td>
    </tr>
</table>
<% end %>
Foi útil?

Solução

This is because you try to pass the ActionDispatch::Http::UploadedFile Object as a path instead of the real path. You do:

@csv_text = File.read(params[:list][:file])

you should do:

@csv_text = File.read(params[:list][:file].tempfile.to_path.to_s)

Also it might be a problem that you use :method => :get when you upload not so tiny files. Genereally GET and File Upload arent such a great combination.^^

Outras dicas

6/27/2017 - Hopefully someone will benefit from this if they are in the same situation I was.

It turns out, whereas I had:

  = form_tag action: :bulk_upload_submit, multipart: true do
    ...
          = file_field_tag :file, accept: 'text/csv'

and it was sending the file params as:

"file"=>"subscribers.csv"

I needed to change the form_tag to use a path instead of an action:

= form_tag upload_subscribers_path, multipart: true do

which changed the params to:

"file"=>
  #<ActionDispatch::Http::UploadedFile:0x007ffda857b5e0
   @content_type="text/csv",
   @headers="Content-Disposition: form-data; name=\"file\"; filename=\"subscribers.csv\"\r\nContent-Type: text/csv\r\n",
   @original_filename="subscribers.csv",
   @tempfile=#<File:/var/folders/_4/50fjk9z57x544klj30k0g1780000gn/T/RackMultipart20170627-33947-12xwfow.csv>>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top