Uploading a File in a Rails Site to Use to Update
I want to upload a file to my rails webpage, but not store it in the database. I just want to upload it and then get the data out of it and update the database with the information in the uploaded file.
I have a settings controller that I use for most administrative tasks. So this is where I’m going to put the form for the file upload.
View:
<%= form_tag({action: :upload}, multipart: true) do %>
Upload xml file of abstracts: <%= file_field_tag 'abstracts' %>
<%= submit_tag %>
<% end %>
Routes:
resources :settings, only: [:index, :edit, :update] do
post 'upload', on: :collection
end
Controller:
def upload
file_data = params[:abstracts].tempfile
match_abstracts(file_data)
flash[:notice] = "File uploaded"
redirect_to settings_path
end
Then the method match_abstracts is where I do all the work I want to do on the file. Right now, all I have is the information matching names in the uploaded file with names stored in the database.
def match_abstracts(file_data)
File.open(file_data) do |file|
@doc = Nokogiri::XML(file)
elems = @doc.xpath("//Speaker")
@applicants = Applicant.without_abstract
@applicants.each do |applicant|
elems.each do |e|
if e.parent.at('AcceptedTrack')
if ((e.at('FirstName').text == applicant.firstname) && (e.at('FamilyName').text == applicant.lastname))
logger.info "=="
logger.info "TITLE: #{e.parent.at('Title').text}"
logger.info "ABSTRACT: #{e.parent.at('Content').text}"
logger.info "#{e.at('FirstName').text}"
logger.info "#{e.at('FamilyName').text}"
end
end
end
end
end
end
This just prints to the log the information that I’ll need to use to update the database. Next I need to write another method, probably called update_applicant with the commands to add this information to the applicant’s record.