2012-04-05 3 views
36

Mit Paperclip 3.0.1 in Schienen 3.2.2 habe ich diesen Fehler:Paperclip Ausnahme: Paperclip :: AdapterRegistry :: NoHandlerError

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

In meinem Modell habe ich:

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 

Die Ausnahme

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

mit params: wird bei erhöhter

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

Wer weiß, was los ist?

Antwort

0

Stellen Sie sicher, dass Sie die Datenbank nach der Installation von Paperclip migrieren ('rake db: migrate') ... Außerdem müssen Sie die neuen Datenfelder von Paperclip zu Ihrer 'attr_accessible'-Zeile im Modell hinzufügen. Ich hatte ein ähnliches Problem, als ich versuchte, Paperclip in einem meiner Projekte arbeiten zu lassen.

+0

Leider löst dies nicht das Problem für mich. Gleiches Problem beim Hinzufügen von attr_accessible: title,: description,: price,: assets_attributes, –

26

Ich bin gerade selbst auf dieses Problem gestoßen. In meinem Fall wurde es durch Überspringen der mehrteiligen Formular-Deklaration im Markup verursacht.

Ich war mit formtastic so habe ich diese und habe es funktioniert:

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

+4

Wenn Sie form_for verwenden und Felder außerhalb des Builders hinzufügen, müssen Sie for_googlemers manuell erzwingen, dass form_for mehrteilig ist, über ': html = > {: multipart => true} 'wie oben gezeigt. Das Hinzufügen von ': multipart => true' funktioniert nicht wie bei form_tag – agmin

+0

Diese Antwort funktionierte für mich! Ich hoffe, der Fragesteller würde dies akzeptieren. Dies ist normalerweise der Fall, wenn Sie ein Formular für ein Modell erstellen und dann geschachtelte Attribute für Unterobjekte haben, die Dateien als Anhänge akzeptieren, was in meinem Fall das Szenario war. (in Bezug auf meine Geschichte für zukünftige Googler) –

+0

Sie haben meinen Tag gespeichert –

0

ich das gleiche Problem getroffen haben, ich glaube, es ist, weil es zwei Tabellen die gleiche attached_file_name teilen ... In Mein Fall, ich füge eine Spalte :photo zu Aktivitäten und Tweets, dann scheint der Fall zu sein, dass das System eines von ihnen finden kann, aber nicht das andere. Da die Dateien in /public/photo/:id/:id Pfad gespeichert sind, wenn Sie zwei Spalten beide als photo benannt haben, dann tritt das Problem auf, denke ich.

43

Dieser Fehler wird ausgelöst, weil Sie Paperclip keine korrekte Klasse zuweisen. Es ist nur ein String.

Sie sollten so etwas wie dies 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>>} 

erhalten Und Sie sollten so etwas wie dies in yout sehen (in HAML, sehr vereinfacht):

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

Denken Sie daran, Ihr Formular auf multipart: true.

+2

Ja, denken Sie daran, die Multipart-Option zu setzen. Zum Beispiel: <% = form_for @video,: method =>: put,: html => {: multipart => true} do%> –

+1

Bei form_tag sollte es 'form_tag path,: multipart => true' sein ohne: HTML-Schlüssel. [Link] (https://github.com/thoughtbot/paperclip/issues/865) –

2

Ich hatte <input type="file" ... multiple="multiple"> auf Dateieingabe, also Büroklammeranhang Daten in einem Array. Ich löste dies einfach durch Entfernen mehrerer Attribute bei der Dateieingabe.

+2

Das war auch mein Problem. Ich mochte die Bequemlichkeit von ': multiple => true', aber wie du sagst, setzt sie den Namen' upload [upload] [] '. Wie auch immer, ich mag den Komfort der Mehrfachauswahl von Dateien sehr, also setze ich den Namen manuell so, dass er kein Array mit ': name => 'upload [upload]'' ist. –

+0

Ich füge mehrere mit Javascript zusammen mit jquery fileupload;) – Mirko

+0

Hah! Fast drei Jahre später, und genau auf dieses Problem stieß ich bei einem anderen Projekt. Nach wie vor lösten diese Antwort und mein Kommentar mein Problem. –

1

Ich bin mir ziemlich sicher, dass Ihr Problem mit dem form_for in der Ansicht ist, versuchen etwas wie folgt aus:

<%= 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 %> 
4

Hinweis es eine Situation, wenn sie mit einem HTML5-Canvas arbeiten, die erwähnenswert ist. Wenn Sie die Canvas-Daten als DataURI-Zeichenfolge abrufen und diese an den Server senden, kann dieser Fehler auftreten. Canvas .toDataURL() wird etwas wie "data: image/png; base64, iVBORw0KGg ..." geben, das Sie mit anderen Informationen an den Server senden können, also anders als ein standardmäßiges mehrteiliges Formular-Upload. Auf der Serverseite, wenn Sie dies nur auf das Büroklammeranhangfeld setzen, erhalten Sie diesen Fehler. Sie müssen es zu einer Datei oder einem IO-Objekt konvertieren.Sie könnten eine temporäre Datei wie folgt schreiben:

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

oder Rubys StringIO verwenden, die in Schnittstellenspeicher-Datei wie ein wirkt

@docHolder.document = StringIO.new(decoded_image) 

Hoffnung, das hilft.

+0

'StringIO ()' hat den Trick gemacht. –

0

für mich war das Problem wie folgt aus:

ich eine solche Linie in der Steuerung verwendet wird, wie es in einigen Antworten sah:

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

und ich hatte das Problem „kein Handler für die Datei“

so, ich habe gerade "Weg" entfernt und es funktionierte:

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

mein Problem war nicht acceptin g Methode in Routen bekommen, so änderte ich es als Patch-Methode und es funktioniert gut.

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

In meinem Fall habe ich vorging String, wie in @ MauricioPasquierJuan Antwort, aber ich war nicht mit einer Form, damit der Rest der Antwort nicht gelten.

Ich konnte keine Dokumentation finden, wie man einen Anhang programmatisch aktualisiert - welche Typen können zugewiesen werden, und warum das Zuweisen und Speichern des modifizierten Datensatzes geänderte Anhänge nicht speichert. Diese Frage kam mir am nächsten.

Innerhalb einer Funktion, die Dateien in einer hochgeladenen Zip-Datei zu verarbeiten, nachdem entpackten Dateien auf temporäre Dateien zu speichern, dies ist meine Lösung ist:

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

Wenn wir von 4.2.x Upgrade auf 4.3.x, wir hatten Ändern des Haupt-Büroklammer-Feldattributs (picture, image usw.) von einer relativen URL zu einer vollständigen URL, um diesen Fehler zu vermeiden.

Verwandte Themen