I’m trying to follow an example from ‘Agile Web Development with Rails’ (3rd ed) which shows how to upload an image file, except that I’m trying to upload a csv file.
The ‘magic’ that the example shows is how the file_field helper method can say “file_field(“uploaded_file”)” when there is actually no “uploaded_file” column in the upload table, because the following method can be put in the model:
def uploaded_file=(upload_field) self.filename = base_part_of(file_field.original_filename) # is here is where the uploaded file can be parsed? FasterCSV.foreach(file.path,:headers=>“first_row”, :col_sep=>“\t”) do |row| row.each{|row| puts “row: #{row.inspect}”} end end
def base_part_of(file_name) File.basename(file_name) end
However, this method never seems to fire. Instead, when I upload the file, I get the error:
ERROR: null value in column "filename" violates not-null constraint
which, of course, would happen if a record is inserted without assigning the filename to the upload object.
My code is shown below; would appreciate if anyone can tell me why my uploaded_file method is not firing:
My model: <% form_tag (:action=> ‘create’, :multipart => true) do %> <%= file_field_tag ‘uploaded_file’ %>
<%= submit_tag "Upload" %>
<% end %>
My controller: def create @upload = Upload.new(params[:upload])
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
My model: require ‘fastercsv’
def new @upload = Upload.new end
def uploaded_file=(upload_field) self.filename = base_part_of(file_field.original_filename) # is here is where the uploaded file can be parsed? FasterCSV.foreach(file.path,:headers=>“first_row”, :col_sep=>“\t”) do |row| row.each{|row| puts “row: #{row.inspect}”} end end
def base_part_of(file_name) File.basename(file_name) end