what's the correct syntax to process a file_field object?

80 views
Skip to first unread message

rixter

unread,
Feb 25, 2011, 3:27:02 PM2/25/11
to rubyonra...@googlegroups.com
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") %><br/>
 
  <%= 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



Bryan Crossland

unread,
Feb 25, 2011, 4:50:18 PM2/25/11
to rubyonra...@googlegroups.com
On Fri, Feb 25, 2011 at 2:27 PM, rixter <case...@gmail.com> wrote:

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]))

The last line above is calling params[:upload_file] and not params[:upload][:upload_file]. params[:upload_file] doesn't exist according to your view layout.

B.
Reply all
Reply to author
Forward
0 new messages