Todas las cargas deben tener al menos 150x150 píxeles. ¿Cómo validarlo con Carrierwave?Valide el tamaño de la imagen en el cargador de onda transportadora
Respuesta
¿Por qué no usar MiniMagick? respuesta modificada de DelPiero:
validate :validate_minimum_image_size
def validate_minimum_image_size
image = MiniMagick::Image.open(picture.path)
unless image[:width] > 400 && image[:height] > 400
errors.add :image, "should be 400x400px minimum!"
end
end
Mi solución: https://gist.github.com/1239078
Me sorprendió lo difícil que era para buscar alrededor para una manera clara para validar ancho de la imagen & altura con CarrierWave. La solución anterior de @ Kir está en lo cierto, pero quería dar un paso más para explicar lo que hizo y los pequeños cambios que hice.
Si nos fijamos en lo esencial su https://gist.github.com/1239078, la respuesta está en la devolución de llamada before :cache
que tiene en la clase Uploader. La línea mágica es
model.avatar_upload_width, model.avatar_upload_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i }
en su caso, avatar_upload_width & avatar_upload_height son atributos de su modelo de usuario. No quería que tienen para almacenar ancho & altura en la base de datos, por lo que en mi modelo dije:
attr_accessor :image_width, :image_height
Recuerde, puede utilizar attr_accessor para los atributos que desea tener en la mano cuando jugar con una grabar, pero simplemente no quiero persistirlos a la base de datos. Así que mi línea mágica realidad convertido en
model.image_width, model.image_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i }
así que ahora tengo el ancho & altura de mi imagen almacenada en el objeto del modelo. El último paso es escribir una validación personalizada para las dimensiones, por lo que en el modelo que necesita algo así como
validate :validate_minimum_image_size
Y entonces por debajo de ella a definir su método de validación personalizada, igual que en la esencia
# custom validation for image width & height minimum dimensions
def validate_minimum_image_size
if self.image_width < 400 && self.image_height < 400
errors.add :image, "should be 400x400px minimum!"
end
end
me hizo un validador poco más completo basado en la respuesta de @ skalee
class ImageSizeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value.blank?
image = MiniMagick::Image.open(value.path)
checks = [
{ :option => :width,
:field => :width,
:function => :'==',
:message =>"Image width must be %d px."},
{ :option => :height,
:field => :height,
:function => :'==',
:message =>"Image height must be %d px."},
{ :option => :max_width,
:field => :width,
:function => :'<=',
:message =>"Image width must be at most %d px."},
{ :option => :max_height,
:field => :height,
:function => :'<=',
:message =>"Image height must be at most %d px."},
{ :option => :min_width,
:field => :width,
:function => :'>=',
:message =>"Image width must be at least %d px."},
{ :option => :min_height,
:field => :height,
:function => :'>=',
:message =>"Image height must be at least %d px."},
]
checks.each do |p|
if options.has_key?(p[:option]) and
!image[p[:field]].send(p[:function], options[p[:option]])
record.errors[attribute] << p[:message] % options[p[:option]]
end
end
end
end
end
usarlo como validates :image, :image_size => {:min_width=>400, :min_height => 400}
.
¡Eso es increíble! – Kir
Muy útil. Gracias por compartir esto. –
¡Gran hombre de trabajo! –
Acabo de hacer un validador personalizado que pretende ser más sintaxis de Rails 4+ amigable.
Tomé ideas de las otras respuestas en este hilo.
Aquí está el quid: https://gist.github.com/lou/2881f1aa183078687f1e
y se puede utilizar de esta manera:
validates :image, image_size: { width: { min: 1024 }, height: { in: 200..500 } }
En este caso particular que debe ser:
validates :image, image_size: { width: 150, height: 150 }
- 1. ¿Cómo cortar la onda transportadora en Rspec?
- 2. ¿Cómo puedo hacer un post procesador de onda transportadora personalizado?
- 3. ¿Cuál es la forma correcta de copiar un archivo de onda transportadora de un registro a otro?
- 4. ckfinder cambiar el tamaño de la imagen
- 5. Reducir el tamaño de la imagen C#
- 6. ¿Cómo cambiar el tamaño de la imagen original en un tamaño de imagen común en Java?
- 7. UIImageView: ¿Cambiar el tamaño al tamaño de la imagen?
- 8. Cambiar el tamaño de la imagen JPEG al tamaño especificado
- 9. es posible ampliar/escalar el tamaño de fuente (y el tamaño de la imagen) en JEditorPane
- 10. Cambiar el tamaño del mapa de imagen en el tamaño de la ventana
- 11. Obtener el tamaño completo de la imagen en javascript/jquery
- 12. ¿Cómo cambiar el tamaño de la imagen en Android?
- 13. ¿Limitaciones del tamaño de la imagen en el safari móvil?
- 14. Cambiar el tamaño de la imagen original en Paperclip
- 15. Validar el tamaño de la imagen en django admin
- 16. Cambiar el tamaño de la imagen en Core Graphics
- 17. Obtener tamaño de imagen real, después de cambiar el tamaño
- 18. PIL cómo escalar el tamaño del texto en relación con el tamaño de la imagen
- 19. Cambiar el tamaño de una imagen en el balanceo
- 20. Cambiar el tamaño de la imagen de mapa de bits
- 21. Obtener tamaño de imagen desde el controlador
- 22. Cómo cambiar el tamaño de imagen UIBarButtonItem
- 23. cómo reducir el tamaño de la imagen grande al tamaño de la miniatura en android
- 24. ¿Puede ImageMagick devolver el tamaño de imagen?
- 25. Android ¿Cambia el tamaño de la imagen según el tamaño de pantalla?
- 26. Cambiar el modo de tamaño de una imagen de fondo en el cuadro de imagen
- 27. Cambiar el tamaño de la imagen de acuerdo con el tamaño del texto
- 28. Cambiando el tamaño de la imagen de fondo para ajustar
- 29. IOS: reduzca el tamaño de la imagen sin reducir la calidad de la imagen
- 30. C# por qué cambiar el tamaño de la imagen aumentará el tamaño del archivo
¡Genial! Tu camino es realmente mejor. – Kir
@skalee Recibo el siguiente error: Errno :: ENOENT en PhotosController # create No existe tal archivo o directorio -, ¿Por qué es esto? – Gibson
Creo que el código tiene un error. Si su atributo de imagen es ': picture', agregaría errores al atributo': picture', no ': image' – Anwar