Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upload a text file and parse contents into database in RoR

So far I've managed to upload a file:

# In new.html.erb
<%= file_field_tag 'upload[file]' %>

And access the file in the controller

# In controller#create
@text = params[:upload][:file]

However, this gives me just the filename, not the file's contents. How do I access its contents?

I know this a jump, but once I can access the file's contents, would it all be possible to upload a folder and iterate through the files?

like image 513
nathan Avatar asked May 03 '12 06:05

nathan


2 Answers

Complete Example

Take, for example, uploading an import file containing contacts. You don't need to store this import file, just process it and discard it.

Routes

routes.rb

resources :contacts do 
  collection do
    get 'import/new', to: :new_import  # import_new_contacts_path

    post :import                       # import_contacts_path
  end
end

Form

views/contacts/new_import.html.erb

<%= form_for @contacts, url: import_contacts_path, html: { multipart: true } do |f| %>

  <%= f.file_field :import_file %>

<% end %>

Controller

controllers/contacts_controller.rb

def new_import
end

def import
  begin
    Contact.import( params[:contacts][:import_file] ) 

    flash[:success] = "<strong>Contacts Imported!</strong>"

    redirect_to contacts_path

  rescue => exception 
    flash[:error] = "There was a problem importing that contacts file.<br>
      <strong>#{exception.message}</strong><br>"

    redirect_to import_new_contacts_path
  end
end

Contact Model

models/contact.rb

def import import_file 
  File.foreach( import_file.path ).with_index do |line, index| 

    # Process each line.

    # For any errors just raise an error with a message like this: 
    #   raise "There is a duplicate in row #{index + 1}."
    # And your controller will redirect the user and show a flash message.

  end
end

Hope that helps!

Joshua

like image 75
Joshua Pinter Avatar answered Nov 15 '22 01:11

Joshua Pinter


In new.html.erb

<%= form_tag '/controller/method_name', :multipart => true do %>
   <label for="file">Upload text File</label> <%= file_field_tag "file" %>
   <%= submit_tag %>
<% end %>

In controller#method_name

uploaded_file = params[:file]
file_content = uploaded_file.read
puts file_content

see more for file upload in rails http://www.tutorialspoint.com/ruby-on-rails/rails-file-uploading.htm How to read whole file in Ruby?

Hope this will help you.

like image 23
suvankar Avatar answered Nov 14 '22 23:11

suvankar