Carga de imágenes
Last updated
Last updated
Hasta la versión 5.1 de Ruby on Rails, la forma más fácil de implementar carga de imágenes, y de archivos en general, es con alguna gema como , o .
Sin embargo, desde la versión 5.2, Ruby on Rails incluye una módulo para cargar archivos llamado ActiveStorage.
En este capítulo vamos a mostrar primero cómo configurar , que es quizá la gema más popular. Luego hablaremos de ActiveStorage.
Por defecto almacena la imagen de forma local pero más adelante veremos cómo almacenarla en servicios externos.
Independiente de si utilizas una gema o ActiveStorage vas a necesitar instalar , una herramienta que permite manipular imágenes.
Para instalar en Ubuntu (or any Debian base Linux distribution) utiliza el siguiente comando:
En Mac la forma más fácil es a través de :
En Windows ... estás por tu cuenta amigo (mentira, queda pendiente esta parte ;)
El primer paso es incluir la gema en tu Gemfile
:
Y ejecutar bundle install
.
Para agregar imágenes a tus modelos debes realizar varios pasos que vamos a ver a continuación.
Para agregar una imagen a un nuevo modelo a través del generador de Rails utiliza el tipo attachment
sobre el campo que va a contener la información de la imagen:
Para agregar una imagen a un modelo existente debes ejectuar el siguiente comando (asumiendo que el modelo se llama Product
y el campo para la imagen se va a llamar image
):
En el modelo debes agregar has_attached_file
como en el siguiente ejemplo:
En este ejemplo estamos creando dos estilos para la imagen: medium
y thumb
. Cada estilo tiene unas dimensiones dependiendo del contexto en el que se vaya a mostrar.
En el formulario para crear y editar productos debes agregar el campo y asegurarte que el formulario tenga la opción de multipart
:
En el controlador debes permitir el nuevo campo image
:
Para mostrar la imagen utiliza alguna de las siguientes opciones:
La primera muestra la imagen original y las demás son los estilos que definiste en el modelo.
Existen dos formas de verificar si la imagen existe:
Utilizando los método file?
and present?
que verifican si el campo image_file_name
(asumiendo que el campo se llama image
) está presente.
Utilizando el método exists?
que va a verificar si la imagen existe (si utilizas un servicio externo este método puede tomar un tiempo hasta que hace la petición al servicio).
Para eliminar una imagen define el campo en nil
y guarda el objeto:
Para validar que la imagen esté presente utiliza:
Para validar el tamaño utiliza:
Por último, puedes unir todas las validaciones (incluyendo la del tipo de contenido) en una sola validación:
Archivo. Es el adaptador por defecto que almacena la imagen localmente en la carpeta public/system/
de la aplicación.
El primer paso es configurar la gema en el Gemfile
:
Luego, en config/environments/development.rb
, antes del último end
agrega la siguiente configuración:
Por último, crea un archivo config/initializers/aws.rb
con el siguiente contenido reemplazando los valores que están entre <
y >
:
El primer paso para utilizar ActiveStorage es ejecutar los siguientes comandos:
Esos comandos crean dos tablas: active_storage_blobs
and active_storage_attachments
.
Para asociar un archivo a un modelo utilizamos has_one_attached
seguido del nombre que le queremos dar a nuestro archivo. Por ejemplo:
Si queremos asociar varios archivos utilizamos has_many_attached
:
En el formulario para crear y editar productos debes agregar el campo y asegurarte que el formulario tenga la opción de multipart
:
En el controlador debes permitir el nuevo campo image
:
Para mostar la imagen utilizamos el método preview:
Para determinar si una imagen existe utiliza el método attached?
:
Para eliminar una imagen de un modelo utiliza el método purge
:
ActiveStorage no incluye validaciones para las imágenes, así que debemos implementar nuestra propia validación. Por ejemplo, para validar que un archivo exista y sea una imagen utilizaríamos el siguiente código:
El primer paso es configurar el servicio en el archivo config/storage.yml
:
Nota: estamos utilizando variables de entorno para almacenar las llaves de AWS.
Ahora, en la carpeta config/environments/
ubica el ambiente para el que deseas configurar AWS (development.rb
o production.rb
) y modifica la opción config.active_storage.service
con el valor :amazon
:
Por último, no olvides agregar la siguiente línea al Gemfile
:
Y ejecutar bundle install
.
En este ejemplo llamamos el campo image
pero lo puedes llamar como quieras. genera los siguientes campos en el modelo:
Por defecto debemos valirdar el tipo de contenido o, de lo contrario, genera un error.
Por defecto viene con 3 adaptadores de almacenamiento:
También puedes usar Dropbox a través de la gema .
En esta sección vamos a ver la configuración en , que es una de las más populares. Para eso vas a necesitar una cuenta en AWS y crear un bucket (un directorio) en S3 (región "us-east-1") antes de continuar.
Nota: Si quieres configurar en producción modificarías config/environments/production.rb
.
Una recomendación es utilizar la gema para utilizar variables de entorno.
Por defecto ActiveStorage almacena la información localmente en una carpeta de tu computador. Sin embargo, al igual que con , esto es configurable para cada uno de los ambientes (desarrollo, producción y pruebas).
Para usar vas a necesitar una cuenta en AWS y crear un bucket (un directorio) en S3 (región "us-east-1") antes de continuar.