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.
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.
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
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.