2010-02-13 12 views
19

estoy usando un clip en una aplicación de carriles y tienen las siguientes tres validaciones en mi modelovalidaciones paperclip más inteligentes

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'] 

Si el usuario se olvida de añadir un archivo adjunto, los tres validaciones fallan y por lo tanto, el usuario es presentado con los siguientes tres errores:

# 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 

Creo que sería mejor para mostrar sólo el primer error en este caso ya que los otros dos errores son puramente lógico ... yo preferiría que el usuario sólo alguna vez ver el segundos dos errores si se ha agregado un archivo adjunto, pero no cumple con los criterios de validación

Estoy seguro de que no existe una validación precocinada que haga este tipo de cosas y de leer el código en vendor/plugins/paperclip/lib/paperclip.rb Veo que el método validates_attachment_size admite el parámetro: unless se muestra:

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 

Por lo tanto, yo estaba pensando que podía hacer algo como lo siguiente:

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

Pero que rompe la aplicación. Alguien tiene alguna experiencia de hacer este tipo de cosas? Sería una buena contribución al código fuente del clip.

EDIT:

He intentado usar esto:

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

No todo el trabajo, ya que me acabo de arreglé para subir un mp3 5mb con esta validación en su lugar. Pero es prometedor ya que el mensaje de error no aparece cuando el usuario no ha adjuntado una foto.

+0

¿Qué versión del clip se utiliza? Tengo 2.3.1.1 y lo que estás describiendo sucede automáticamente para mí. Si no hay un archivo adjunto, solo devuelve ese error. Si adjunto un archivo, pero las validaciones de tamaño y tipo de contenido fallan, entonces muestra esos errores. –

+0

extraño porque también estoy en el 2.3.1.1 del plugin ... voy a seguir con la sugerencia a continuación sobre la creación de mis propios mensajes de error personalizados porque de todos modos no me gusta la forma en que te dicen que el accesorio necesita estar entre 0 y X bytes .... – stephenmurdoch

+0

Estoy usando 2.3.2 con el mismo problema –

Respuesta

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

esto es perfecto - gracias. – stephenmurdoch

+1

Mejor que eso:: if => Proc.new {| imports | ! imports.photo.file? } –

+0

No sé en qué versión se dio esta respuesta, pero no está funcionando en mi sistema local (ejecutando Paperclip 2.3.11 en Rails 3.1.3). – pcg79

5

Creo que puede hacerlo de otra manera. No te metas con las validaciones. Es probable que tenga algo como esto en su formulario:

<%= f.error_messages %> 

Puede quitarlo y escribir su propio ayudante para mostrar mensajes de error. Los errores se almacenan en picadillo:

@photo.errors 

O si lo desea llegar a ellos a través de creador de formularios:

f.object.errors 
+0

Buen enfoque, inteligente – astropanic