2012-04-05 16 views
36

Utilizzando Paperclip 3.0.1 a 3.2.2 rotaie ho ottenuto questo errore:eccezione Paperclip: Paperclip :: :: AdapterRegistry NoHandlerError

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

Nel mio modello ho:

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'eccezione è sollevato a:

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

con params:

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

Qualcuno sa cosa sta succedendo?

risposta

0

Assicurati di migrare il database dopo aver installato Paperclip ('rake db: migrate') ... Inoltre, potresti dover aggiungere i nuovi campi dati generati da Paperclip alla tua linea 'attr_accessible' nel modello. Ho avuto un problema simile quando stavo cercando di far funzionare Paperclip su uno dei miei progetti.

+0

sfortunatamente, questo non risolve il problema per me. Lo stesso problema aggiungendo attr_accessible: title,: description,: price,: assets_attributes, –

26

Mi sono imbattuto in questo problema. Nel mio caso è stato causato saltando la dichiarazione del modulo multipart nel markup.

Stavo usando Formtastic così ho aggiunto questo ed ottenuto che funziona:

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

+4

Per i googler futuri, se stai usando form_for e aggiungendo campi al di fuori del builder, devi forzare manualmente form_for per essere multipart, tramite ': html = > {: multipart => true} 'come mostrato sopra. Semplicemente aggiungendo ': multipart => true' non funziona come con form_tag – agmin

+0

Questa risposta ha funzionato per me! Spero che il richiedente lo accetterebbe. Questo di solito accade quando si crea un modulo per un modello, quindi alla fine si hanno attributi nidificati per oggetti secondari che accettano file come allegati che, nel mio caso, erano lo scenario. (relazionando la mia storia qui per i futuri googler) –

+0

Mi hai salvato il giorno –

0

ho incontrato lo stesso problema, penso che sia perché ci sono due tabelle che condividono lo stesso attached_file_name ... In Nel mio caso, aggiungo una colonna :photo alle attività e ai tweet, quindi il caso sembra essere che il sistema possa trovarne uno ma non l'altro. Poiché i file vengono salvati nel percorso /public/photo/:id/:id, se si dispone di due colonne entrambe denominate come photo, il problema si verifica credo.

43

Questo errore viene generato perché non si sta dando a Paperclip una classe corretta. È solo una stringa.

Si dovrebbe ricevere qualcosa di simile 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>>} 

e si dovrebbe avere qualcosa di simile a yout View (in HAML, molto semplificata):

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

Ricordate di impostare il modulo per multipart: true.

+2

Sì, ricordati di impostare l'opzione multipart. Ad esempio: <% = form_for @video,: method =>: put,: html => {: multipart => true} do%> –

+1

In caso di form_tag dovrebbe essere 'form_tag path,: multipart => true' senza: chiave html. [Link] (https://github.com/thoughtbot/paperclip/issues/865) –

2

Avevo <input type="file" ... multiple="multiple"> per l'input di file, quindi i dati di allegato di paperclip erano in un array. Ho risolto questo semplicemente rimuovendo più attributi sull'input del file.

+2

Questo era il mio problema, pure. Mi è piaciuta la comodità di ': multiple => true', ma come dici tu, imposta il nome come' upload [upload] [] '. Tuttavia, mi piace molto la praticità della selezione di file multipli, quindi ho impostato il nome manualmente per non essere un array con ': name => 'upload [upload]''. –

+0

Aggiungo più javascript con jquery fileupload;) – Mirko

+0

Hah! Quasi tre anni dopo, e mi sono imbattuto in questo esattamente in un altro progetto, e come prima, questa risposta e il mio commento hanno risolto il mio problema. –

1

Sono piuttosto sicuro che il problema è con il form_for nella vista, provare qualcosa di simile:

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

Nota c'è una situazione quando si lavora con una tela HTML5 che è degno di nota. Ottenere i dati canvas come una stringa DataURI e inviarli al server può causare questo errore. Canvas .toDataURL() fornisce qualcosa come "data: image/png; base64, iVBORw0KGg ..." che puoi inviare al server con altre informazioni, quindi è diverso da un caricamento di modulo multiparte standard. Sul lato server se si imposta questa opzione sul campo allegato di paperclip, si otterrà questo errore. È necessario convertirlo in un file o un oggetto IO.Si potrebbe scrivere un file temporaneo come questo:

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

o utilizzare StringIO di Ruby che agisce come un'interfaccia file di memoria

@docHolder.document = StringIO.new(decoded_image) 

Spero che questo aiuti.

+0

'StringIO ()' ha fatto il trucco. –

0

per me il problema è stato in questo modo:

ho usato tale linea nel controllore, come visto in alcune risposte:

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

e ho avuto il problema "no gestore per il file"

così, ho appena rimosso "percorso" e ha funzionato:

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

il mio problema non era acceptin g get metodo in percorsi quindi l'ho cambiato come metodo di patch e funziona bene.

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

Nel mio caso ero di passaggio a corde, come in @ risposta di MauricioPasquierJuan, ma non stavo usando un modulo in modo che il resto della risposta non si applica.

Non sono riuscito a trovare alcuna documentazione su come aggiornare un allegato in modo programmatico, quali tipi possono essere assegnati e perché l'assegnazione e il salvataggio del record modificato non salvano gli allegati modificati. Questa domanda è stata la cosa più vicina che ho trovato.

All'interno di una funzione che elabora i file all'interno di un file zip caricato, dopo il salvataggio file estratti i file temporanei, questa è la mia soluzione:

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

Quando abbiamo aggiornato da 4.2.x alla 4.3.x, abbiamo avuto per modificare l'attributo del campo paperclip principale (picture, image, ecc.) da un URL relativo a un URL completo per eliminare questo errore.