Home » Ruby » Uploading a file in Rails

Uploading a file in Rails

Posted by: admin November 30, 2017 Leave a comment

Questions:

I’m new to rails, and I’m writing a RESTful website using the CRUD technique. So far I have created three pages, all of which allow the user to create, edit, and delete a row from the database. However, my fourth page will need to include an upload file form, but a) I don’t know how the filesystem works with Rails thus I don’t know where files should be stored. The file would be around 100kb and couldn’t be stored in temporary storage because it will be constantly downloaded. And b) I don’t know how to write to a file.

It would be great if you could tell me how to do what I mentioned above – create an upload input on an input form, and to then write the file to a filepath in a separate directory.

Answers:

While there are plenty of gems that solve file uploading pretty nicely (see https://www.ruby-toolbox.com/categories/rails_file_uploads for a list), rails has built-in helpers which make it easy to roll your own solution.

Use the file_field-form helper in your form, and rails handles the uploading for you:

<%= form_for @person do |f| %>
  <%= f.file_field :picture %>
<% end %>

You will have access in the controller to the uploaded file as follows:

uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
  file.write(uploaded_io.read)
end

It depends on the complexity of what you want to achieve, but this is totally sufficient for easy file uploading/downloading tasks. This example is taken from the rails guides, you can go there for further information: http://guides.rubyonrails.org/form_helpers.html#uploading-files

Questions:
Answers:

There is a nice gem especially for uploading files : carrierwave. If the wiki does not help , there is a nice RailsCast about the best way to use it . Summarizing , there is a field type file in Rails forms , which invokes the file upload dialog. You can use it , but the ‘magic’ is done by carrierwave gem .

I don’t know what do you mean with “how to write to a file” , but I hope this is a nice start.

Leave a Reply

Your email address will not be published. Required fields are marked *