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?
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
.
form_tag path, :multipart => true
without :html key. Linkbartolo-otrit 2016-01-22 08:26
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|
:html => {:multipart => true}
as shown above. Simply adding :multipart => true
doesn't work like it does with form_ta - agmin 2012-10-18 02:27
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.
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.
:multiple => true
, but as you say, it sets the name as upload[upload][]
. However, I really like the convenience of multiple file selection, so I just set the name manually to not be an array with :name => 'upload[upload]'
- Matthew Clark 2012-12-13 14:26
my problem was not accepting get method in routes so i changed it as patch method and it work fine.
<%= form_for @product, :url => "/products/#{@product.id}/upload",:method => :patch, :html => { :multipart => true } do |f| %>
I'm pretty sure your problem is with the form_for in the view, try something like this:
<%= form_for @restaurante, :html => { :multipart => true } do |form| %>
Nome:<%= form.text_field :nome%>
Endereço:<%= form.text_field :endereco %>
Especialidade:<%= form.text_field :especialidade %>
Foto:<%= form.file_field :foto %>
<%= form.submit 'create'%>
<% end %>
Make sure you migrate the database after you install Paperclip ('rake db:migrate')... Also, you might need to add the new data fields generated by Paperclip to your 'attr_accessible' line in the model. I had a similar problem when I was trying to get Paperclip workin on one of my projects.
I have met the same problem, I think it is because there are two tables sharing the same attached_file_name
... In my case, I add a :photo
column both to activities and tweets, then the case seems to be that the system can find one of them but not the other. Because the files are saved in /public/photo/:id/:id
path, if you have two columns both named as photo
, then the problem occurs I think.
for me the problem was like this:
I used such line in controller, as saw it in some answers:
@image = User.find(params[:id]).image.<b>path</b>(:small)
and I had the problem "no handler for the file"
so, I just removed "path" and it worked:
@image = User.find(params[:id]).image(:small)
In my case I was passing String, as in @MauricioPasquierJuan's answer, but I wasn't using a form so the rest of the answer doesn't apply.
I couldn't find any documentation of how to programatically update an attachment - what types can be assigned, and why assigning and saving the modified record does not save modified attachments. This question was the closest thing I found.
Inside a function that process files inside an uploaded zip file, after saving extracted files to temp files, this is my solution:
record.attachment = File.new( tempfile_path_as_string ) ## probably not the only option
record.attachment.save ## next line doesn't update attachment without this
record.save
When we upgraded from 4.2.x to 4.3.x, we had to change the main paperclip field attribute (picture
, image
, etc) from a relative URL to a full URL to eliminate this error.