2010-02-13 14 views
19

sto usando graffetta in un app rotaie e hanno le seguenti tre validazioni nel mio modelloSmarter convalide graffetta

validates_attachment_presence :photo      
validates_attachment_size :photo, :less_than=>1.megabyte 
validates_attachment_content_type :photo, :content_type=>['image/jpeg', 'image/png', 'image/gif'] 

Se l'utente dimentica di aggiungere un allegato, tutte e tre le convalide falliscono e, quindi, l'utente è presentato con le seguenti tre errori:

# Photo file name must be set. 
# Photo file size file size must be between 0 and 1048576 bytes. 
# Photo content type is not included in the list 

penso che sarebbe meglio per mostrare solo il primo errore in questo caso dal momento che gli altri due errori sono puramente consequenziale ... io preferirei che l'utente sempre e solo vedere il secondi due errori se è stato aggiunto un allegato ma non soddisfa i criteri di convalida.

Sono certo che non esiste una convalida pre-cotta che fa questo genere di cose e dalla lettura del codice in vendor/plugins/paperclip/lib/paperclip.rb vedo che il metodo validates_attachment_size supporta: a meno parametro come mostrato:

def validates_attachment_presence name, options = {} 
    message = options[:message] || "must be set." 
    validates_presence_of :"#{name}_file_name", 
         :message => message, 
         :if  => options[:if], 
         :unless => options[:unless] 
end 

Così, ho pensato che avrei potuto fare qualcosa di simile al seguente:

validates_attachment_size :photo, :less_than=>1.megabyte, :unless=> :photo.blank 

Ma che rompe l'applicazione. Qualcuno ha qualche esperienza nel fare questo genere di cose? Sarebbe un bel contributo al codice sorgente di paperclip.

EDIT:

Ho provato con questo:

validates_attachment_size :photo, :less_than=>1.megabyte, 
    :unless=> Proc.new { |image| image[:photo].nil? } 

Lo fa non proprio lavoro anche se, come ho appena riuscito a caricare un mp3 5 MB con questa convalida in atto. Ma è promettente visto che il messaggio di errore non appare quando l'utente non ha allegato una foto.

+0

Quale versione di graffetta stai usando? Ho 2.3.1.1 e quello che stai descrivendo avviene automaticamente per me. Se nessun file è allegato, restituisce solo quell'errore. Se allego un file, ma le convalide per tipo di dimensione e contenuto non riescono, vengono visualizzati quegli errori. –

+0

strano perché sono su 2.3.1.1 del plug-in anche ... ho intenzione di andare con il suggerimento qui sotto sulla creazione di miei messaggi di errore personalizzati comunque perché non mi piace il modo in cui ti dicono che il bisogno ha bisogno essere tra 0 e X byte .... – stephenmurdoch

+0

Sto usando 2.3.2 con lo stesso problema –

risposta

29
validates_attachment_size :photo, :less_than => 1.megabyte, 
    :unless => Proc.new { |imports| imports.photo_file_name.blank? } 
+0

questo è perfetto - grazie. – stephenmurdoch

+1

Meglio di così:: if => Proc.new {| importazioni | ! Imports.photo.file? } –

+0

Non so a quale versione questa risposta è stata data, ma non funziona sul mio sistema locale (con Paperclip 2.3.11 su Rails 3.1.3). – pcg79

5

Penso che tu possa farlo in un altro modo. Non scherzare con le convalide. Probabilmente hai qualcosa di simile nella tua forma:

<%= f.error_messages %> 

È possibile rimuoverlo e scrivere il proprio helper per visualizzare i messaggi di errore. Gli errori sono memorizzati in hash:

@photo.errors 

Oppure, se si vuole ottenere a loro attraverso costruttore di forma:

f.object.errors 
+0

Bello approccio, intelligente – astropanic