web-dev-qa-db-fra.com

Exception Paperclip: Paperclip :: AdapterRegistry :: NoHandlerError

Utilisation de Paperclip 3.0.1 dans Rails 3.2.2 J'ai eu cette erreur:

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

Dans mon modèle j'ai: 

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

L'exception est déclenchée à:

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

avec params: 

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

Quelqu'un sait ce qui se passe?

39
Sten Ka Razin

Cette erreur est déclenchée parce que vous ne donnez pas à Paperclip une classe correcte. C'est juste une corde.

Vous devriez recevoir quelque chose comme ceci dans 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>>}

Et vous devriez avoir quelque chose comme ceci dans votre vue (en HAML, très simplifiée):

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

N'oubliez pas de définir votre formulaire sur multipart: true.

45

Je viens de rencontrer ce problème moi-même. Dans mon cas, cela a été provoqué en sautant la déclaration de formulaire multipart dans le balisage.

J'utilisais formtastic alors j'ai ajouté ceci et je l'ai fait fonctionner:

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

27
Ken Mazaika

Notez qu'il est intéressant de noter le fait que vous travaillez avec un canevas HTML5. Obtenir les données de la zone de dessin sous forme de chaîne DataURI et les envoyer au serveur peut être à l'origine de cette erreur. Canvas .toDataURL () donnera quelque chose comme "data: image/png; base64, iVBORw0KGg ..." que vous pouvez envoyer au serveur avec d'autres informations, ce qui est différent d'un téléchargement de formulaire en plusieurs parties standard. Côté serveur, si vous définissez simplement ceci dans le champ Pièce jointe de trombone, vous obtiendrez cette erreur. Vous devez le convertir en fichier ou en objet IO. Vous pouvez écrire un fichier temporaire comme ceci:

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

ou utilisez StringIO de Ruby qui agit comme une interface de fichier en mémoire

@docHolder.document = StringIO.new(decoded_image)

J'espère que cela t'aides.

5
bjm88

mon problème était de ne pas accepter la méthode get dans les routes, donc je l'ai changé en tant que méthode de patch et cela fonctionne bien.

<%= form_for @product, :url => "/products/#{@product.id}/upload",:method => :patch, :html => { :multipart => true } do |f| %>
2
Manoranjan

J'avais <input type="file" ... multiple="multiple"> dans l'entrée de fichier, donc les données de pièce jointe de Paperclip étaient dans un tableau .

2
Mirko

Je suis à peu près sûr que votre problème est lié à la forme_for dans la vue, Essayez quelque chose comme ceci:

<%= 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 %>
1
Julio Marins

Lors de la mise à niveau de 4.2.x vers 4.3.x, nous devions modifier l'attribut principal du champ Paperclip (picture, image, etc.) d'une URL relative à une URL complète pour éliminer cette erreur.

0
Kyle Heironimus

Dans mon cas, je passais String, comme dans la réponse de @ MauricioPasquierJuan, mais je n'utilisais pas de formulaire, le reste de la réponse ne s'appliquait pas.

Je n'ai trouvé aucune documentation sur la mise à jour par programme d'une pièce jointe - quels types peuvent être affectés et pourquoi attribuer et enregistrer l'enregistrement modifié n'enregistre pas les pièces jointes modifiées. Cette question était la chose la plus proche que j'ai trouvée.

Dans une fonction qui traite des fichiers dans un fichier Zip téléchargé, après avoir enregistré les fichiers extraits dans des fichiers temporaires, voici ma 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
0
ShadSterling

Assurez-vous de migrer la base de données après avoir installé Paperclip ('rake db: migrate') ... De plus, vous devrez peut-être ajouter les nouveaux champs de données générés par Paperclip à votre ligne "attr_accessible" dans le modèle ... Un problème similaire lorsque j'essayais de faire travailler Paperclip sur l'un de mes projets.

0
Joe Saunders

J'ai rencontré le même problème, je pense que c'est parce qu'il y a deux tables partageant le même attached_file_name... Dans mon cas, j'ajoute une colonne :photo à la fois aux activités et aux tweets. d'entre eux mais pas l'autre. Étant donné que les fichiers sont enregistrés dans le chemin /public/photo/:id/:id, si vous avez deux colonnes nommées photo, le problème se produit, je pense.

0
Yitong Zhou

pour moi le problème était comme ça:

J'ai utilisé une telle ligne dans le contrôleur, comme l'a vu dans certaines réponses:

@image = User.find(params[:id]).image.<b>path</b>(:small)

et j'ai eu le problème "pas de gestionnaire pour le fichier"

alors, je viens de supprimer "chemin" et cela a fonctionné:

@image = User.find(params[:id]).image(:small)
0
Neon_10