Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Paperclip exception : Paperclip::AdapterRegistry::NoHandlerError

Using Paperclip 3.0.1 in rails 3.2.2 I got this error:

**Paperclip::AdapterRegistry::NoHandlerError** 
(No handler found for "2009-11-29-133527.jpg"):

In my model I have:

class Product < ActiveRecord::Base
    ...
    has_many :assets 
    accepts_nested_attributes_for :assets
 end

 class Asset < ActiveRecord::Base
     belongs_to :product
     has_attached_file :image,
               :path => ":rails_root/public/system/:attachment/:id/:style/:filename",
               :url => "/system/:attachment/:id/:style/:filename", 
               :styles => { :medium => "300x300>", :thumb => "100x100>" }
  end

The exception is raised at:

def create
     **@product = Product.new params[:product]**
     ...
end

with params:

{...,
 "product"=>{"title"=>"wibble1", 
             **"assets_attributes"=>{"0"=>{"image"=>"2009-11-29-133527.jpg"}
                                  },** 
             "description"=>"Who is wibble...", 
             "price"=>"23.45"
            }, 
             "commit"=>"Create Product", 
             ...}

Anyone know what's going on?

like image 988
Sten Ka Razin Avatar asked Apr 05 '12 17:04

Sten Ka Razin


4 Answers

This Error is raised because you aren't giving Paperclip a correct class. It's a just a String.

You should receive something like this in params

"asset"=>
  {"image"=>
    #<ActionDispatch::Http::UploadedFile:0x000000056679e8
    @content_type="image/jpg",
    @headers= "Content-Disposition: form-data; name=\"asset[image]\";
      filename=\"2009-11-29-133527.jpg\"\r\nContent-Type: image/jpg\r\n",
    @original_filename=""2009-11-29-133527.jpg"",
    @tempfile=#<File:/tmp/RackMultipart20120619-1043-yvc9ox>>}

And you should have something like this in yout View (in HAML, very simplified):

= form_for @product, html: { multipart: true } do |f|
  = f.fields_for :asset do |asset_form|
    = asset_form.file_field :image

Remember to set your form to multipart: true.

like image 101
Mauricio Pasquier Juan Avatar answered Nov 15 '22 21:11

Mauricio Pasquier Juan


I just ran into this problem myself. In my case it was caused by skipping the multipart form declaration in the markup.

I was using formtastic so I added this and got it working:

semantic_form_for @picture, :html => {:multipart => true} do |f|

like image 40
Ken Mazaika Avatar answered Nov 15 '22 22:11

Ken Mazaika


Note there is a situation when working with an HTML5 canvas that is worth noting. Getting the canvas data as a DataURI string and sending that to server can cause this error. Canvas .toDataURL() will give something like "data:image/png;base64,iVBORw0KGg..." which you can send to server with other information, so its different than a standard multi-part form upload. On the server side if you just set this to the paperclip attachment field you will get this error. You need to conver it to a file or IO object. You could write a temp file like this:

data_uri = params[:canvasDataUri]
encoded_image = data_uri.split(",")[1]
decoded_image = Base64.decode64(encoded_image)
File.open("signature.png", "wb") { |f| f.write(decoded_image) }

or use Ruby's StringIO which acts like an in memory file interface

@docHolder.document = StringIO.new(decoded_image)

Hope this helps.

like image 5
bjm88 Avatar answered Nov 15 '22 22:11

bjm88


I had <input type="file" ... multiple="multiple"> on file input, so paperclip attachment data was in an array. I solved this simply by removing multiple attribute on file input.

like image 2
Mirko Avatar answered Nov 15 '22 21:11

Mirko