I am using Rails 2.1 (and RUBYGEMS VERSION: 1.5.0 RUBY VERSION: 1.8.7) and have been having a devil of a time trying to get a simple thing to work: upload and process a CSV file. After extensively researching many examples both here and elsewhere, I have not been successful in getting this work; yet, I feel I’m so close! So, I am in hopes that someone here could please point out my (hopefully slight) errors below; my current bug is in the first lines of the controller.
Once this part is working, I’ll finish the code that parses the file and stores the data into the database. I do not need to store the uploaded file itself, though I am storing the name of the file that gets uploaded (in the Upload table). I also realize it is better style to have ‘fat models and thin controllers’ but I’m just trying to get this work.
Thanks in advance to anyone who can help!
the view code: <% form_for(:upload, :url => {:action=> :create}, :html => { :multipart => true} ) do |form| %>
Upload your file: <%= form.file_field(“upload_file”,:size=>50,:class => “csv-input”) %>
<%= submit_tag(“Upload”) %>
<% end %>
the controller code:
def create
@upload = Upload.new(params[:upload][:upload_file])
thefile = File.new(params[:upload][:upload_file])
@upload.filename = base_part_of(thefile.original_filename)
@upload.assign_name(thisfilename)
@upload.call(parse_file(params[:upload_file]))
respond_to do |format|
if @upload.save
flash[:notice] = 'Upload was successful.'
format.html { redirect_to(@upload) }
format.xml { render :xml => @upload, :status => :created, :location => @upload }
else
format.html { render :action => "new" }
format.xml { render :xml => @upload.errors, :status => :unprocessable_entity }
end
end
end
def parse_file(file)
FasterCSV.foreach(file.path,:headers=>“first_row”, :col_sep=>“\t”) do |row|
row.each{|row| puts “row: #{row.inspect}”}
end
the model code: def new @upload = Upload.new end
def assign_name(n) @upload.filename = n end