简体   繁体   中英

Uploading Files to db Rails 3 without using external gems

I have a task where I need to upload a file (.txt) in Rails 3.2 without using any external gems to do the leg work(non negotiable I'm afraid) The file also needs to be saved to the database. I have the following code, however when I try to upload/create a new attachment using the form it comes back with the error;

No route matches [POST] "/attachments/create" 

Doesn't look like the create action is being called with uploaded_file from the model, but I'm not sure how to rectify it. If anyone can point me in the right direction it would be greatly appreciated.

So my code is as follows;

AttachmentsController.rb

class AttachmentsController < ApplicationController

 def show
   @attachment = Attachment.find(params[:id])
   end_data @attachment.data, :filename => @attachment.filename, :type =>  @attachment.content_type
 end

 def create      
   return if params[:attachment].blank?

   @attachment = Attachment.new
   @attachment.uploaded_file = params[:attachment]

   if @attachment.save
      flash[:notice] = "Thank you for your submission..."
      redirect_to root_path
   else
      flash[:error] = "There was a problem submitting your attachment."
      render "new"
     end
   end
  end

Attachment.rb

class Attachment < ActiveRecord::Base

 def uploaded_file=(incoming_file)
   self.filename = incoming_file.original_filename
   self.content_type = incoming_file.content_type
   self.data = incoming_file.read
 end

 def filename=(new_filename)
   write_attributes("filename", sanitize_filename(new_filename))
 end

 private

 def santize_filename(filename)
   just_filename = File.basename(filename)
   just_filename.gsub(/[^\w\.\-]/, '_')
  end
 end

views/attachments/new.html.erb

<%= form_tag('create', multipart: true) do %>
  <%= file_field_tag 'attachment' %>
  <%= submit_tag "upload", class: 'btn btn-primary' %>
<% end %>

routes.rb

 resources :attachments

rake routes

    attachments GET    /attachments(.:format)          attachments#index
                POST   /attachments(.:format)          attachments#create
 new_attachment GET    /attachments/new(.:format)      attachments#new
edit_attachment GET    /attachments/:id/edit(.:format) attachments#edit
     attachment GET    /attachments/:id(.:format)      attachments#show
                PUT    /attachments/:id(.:format)      attachments#update
                DELETE /attachments/:id(.:format)      attachments#destroy
           root        /                               static_pages#home

Also the stack info

Started POST "/attachments/create" for 127.0.0.1 at 2012-07-30 22:21:57 +0100

ActionController::RoutingError (No route matches [POST] "/attachments/create"):
actionpack (3.2.3) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
actionpack (3.2.3) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
railties (3.2.3) lib/rails/rack/logger.rb:26:in `call_app'
railties (3.2.3) lib/rails/rack/logger.rb:16:in `call'
actionpack (3.2.3) lib/action_dispatch/middleware/request_id.rb:22:in `call'
rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
rack (1.4.1) lib/rack/runtime.rb:17:in `call'
activesupport (3.2.3) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.4.1) lib/rack/lock.rb:15:in `call'
actionpack (3.2.3) lib/action_dispatch/middleware/static.rb:62:in `call'
railties (3.2.3) lib/rails/engine.rb:479:in `call'
railties (3.2.3) lib/rails/application.rb:220:in `call'
rack (1.4.1) lib/rack/content_length.rb:14:in `call'
railties (3.2.3) lib/rails/rack/log_tailer.rb:14:in `call'
rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service'
/Users/garyrogers/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
/Users/garyrogers/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
/Users/garyrogers/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

Not sure where to go from here.

Instead of writing like this:

<%= form_tag('create', multipart: true) do %>

Try:

<%= form_tag({:controller => 'attachment', :action => 'create'}, :multipart => true) do %>

You can find a lot of good examples from here: http://guides.rubyonrails.org/form_helpers.html

Besides, you probably want to change this line:

<%= submit_tag "upload", class: 'btn btn-primary' %>

to:

<%= submit_tag "upload", :class => 'btn btn-primary' %>

Hope it helps

Update(as of 22/10/2013): The original answer was written when I just started learning Rails(legacy ruby 1.8.7). :class => "btn" and class: "btn" are the same, in fact the latter is favoured in ruby 1.9 and above.

Have you run rake routes ? The restful route for a resource like that is probably just a POST to '/attachments' Take a look at http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM