Active Storage - Como activarlo y usarlo
Almacenamiento de archivos en Ruby on Rails
Active Storage es una característica de Ruby on Rails que se utiliza para manejar el almacenamiento de archivos en aplicaciones web. Esta característica está diseñada para simplificar el manejo de archivos adjuntos, como imágenes, videos, documentos, etc., en tus aplicaciones Rails.
Dentro del contexto de tu perfil como desarrollador de software que trabaja en Ruby on Rails, Active Storage es relevante ya que te permite adjuntar y gestionar archivos en tus aplicaciones Rails de una manera eficiente. Puedes utilizar Active Storage para subir archivos, almacenarlos en diferentes servicios de almacenamiento en la nube (como Amazon S3 o Google Cloud Storage) o en sistemas de archivos locales, y luego asociar estos archivos con modelos en tu base de datos.
Active Storage proporciona una interfaz sencilla para realizar operaciones comunes relacionadas con archivos, como la subida, descarga, eliminación y procesamiento de archivos adjuntos. También es altamente configurable y te permite adaptarlo a tus necesidades específicas.
En resumen, Active Storage en Ruby on Rails es una herramienta importante para trabajar con archivos adjuntos en tus aplicaciones web, lo que puede ser útil en muchos proyectos de desarrollo de software.
Requisitos
Varias características de Active Storage dependen del software de terceros que Rails no instalará y debe instalarse por separado:
libvips v8.6+ o ImageMagick para análisis y transformaciones de imágenes
ffmpeg v3.4+ para vistas previas de vídeo y ffprobe para análisis de vídeo/audio
El análisis y las transformaciones de imágenes también requieren de la image_processing
gema. Descomentelo en su Gemfile
o agréguelo si es necesario:
gem "image_processing", ">= 1.2"
Configuración
Active Storage genera para utilizar tres tablas en la base de datos de su aplicación denominadas active_storage_blobs.
Para su instalación usa rails active_storage:install
y posteriormente para generar las tablas dale a Migrar con rails db:migrate
para que esta se efectue.
active_storage_attachments
es una tabla de unión polimórfica que almacena el nombre de clase de su modelo. Si el nombre de clase de su modelo cambia, deberá ejecutar una migración en esta tabla para actualizar el subyacenterecord_type
al nuevo nombre de clase de su modelo.
Configure los servicios de Active Storage en config/storage.yml
. Para cada servicio que utilice su aplicación, proporcione un nombre y la configuración necesaria. El siguiente ejemplo declara tres servicios denominados local
, test
y amazon
:
local:
service: Disk
root: <%= Rails.root.join("storage") %>
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
amazon:
service: S3
access_key_id: ""
secret_access_key: ""
bucket: ""
region: "" # e.g. 'us-east-1'
Indíquele a Active Storage qué servicio usará configurando Rails.application.config.active_storage.service
. Dado que es probable que cada entorno utilice un servicio diferente, se recomienda hacerlo por entorno. Para utilizar el servicio de disco local del ejemplo anterior en el entorno de desarrollo, agregaría lo siguiente a config/environments/development.rb
:
# Store files locally.
config.active_storage.service = :local
Para utilizar el servicio S3 en producción, agregue lo siguiente a config/environments/production.rb
:
# Store files on Amazon S3.
config.active_storage.service = :amazon
Para utilizar el servicio de prueba durante la prueba, agregue lo siguiente a config/environments/test.rb
:
# Store uploaded files on the local file system in a temporary directory.
config.active_storage.service = :test
Los archivos de configuración específicos del entorno tendrán prioridad: en producción, por ejemplo, el
config/storage/production.yml
archivo (si existe) tendrá prioridad sobre elconfig/storage.yml
archivo.
Se recomienda utilizarlo Rails.env
en los nombres de los bucket para reducir aún más el riesgo de destruir accidentalmente los datos de producción.
amazon:
service: S3
# ...
bucket: your_own_bucket-<%= Rails.env %>
google:
service: GCS
# ...
bucket: your_own_bucket-<%= Rails.env %>
azure:
service: AzureStorage
# ...
container: your_container_name-<%= Rails.env %>
Usar AWS
Para poder usar AWS recuerde Agregar la aws-sdk-s3
gema a tu Gemfile
:
gem "aws-sdk-s3", require: false
Las funciones principales de Active Storage requieren los siguientes permisos:
s3:ListBucket
,s3:PutObject
,s3:GetObject
ys3:DeleteObject
. El acceso público requiere adicionalmentes3:PutObjectAcl
. Si tiene opciones de carga adicionales configuradas, como configurar ACL, es posible que se requieran permisos adicionales.
Adjuntar archivos a registros
has_one_attached - Un archivo por registro
La has_one_attached
configura una asignación uno a uno entre registros y archivos. Cada registro puede tener un archivo adjunto.
Por ejemplo, supongamos que su aplicación tiene un modelo User
. Si quieres que cada usuario tenga un avatar, define en el modelo User
de la siguiente manera:
class User < ApplicationRecord
has_one_attached :avatar
end
Si está utilizando Rails 6.0+, puede ejecutar un comando generador de modelos como este:
rails generate model User avatar:attachment
Puedes crear un usuario con un avatar:
<%= form.file_field :avatar %>
Debemos agregar la validación al controlador respectivo:
class SignupController < ApplicationController
def create
user = User.create!(user_params)
session[:user_id] = user.id
redirect_to root_path
end
private
def user_params
params.require(:user).permit(:email_address, :password, :avatar)
end
end
Use el método avatar.attach
para adjuntar un avatar a un usuario existente:
user.avatar.attach(params[:avatar])
Use el método avatar.attached?
para consultar si un usuario en particular tiene un avatar (o archivo adjunto según corresponda):
user.avatar.attached?
Puede configurar servicios específicos por archivo adjunto usando la opción service
:
class User < ApplicationRecord
has_one_attached :avatar, service: :s3
end
Puede configurar variantes específicas por archivo adjunto llamando al método variant
en el objeto adjunto:
class User < ApplicationRecord
has_one_attached :avatar do |attachable|
attachable.variant :thumb, resize_to_limit: [100, 100]
end
end
Use avatar.variant(:thumb)
para obtener una variante de avatar:
<%= image_tag user.avatar.variant(:thumb) %>
has_many_attached - Varios archivos por registro
La has_many_attached
establece una relación de uno a muchos entre registros y archivos. Cada registro puede tener muchos archivos adjuntos.
Por ejemplo, supongamos que su aplicación tiene un modelo Message
. Si desea que cada mensaje tenga muchas imágenes, defina el modelo Message
de la siguiente manera:
class Message < ApplicationRecord
has_many_attached :images
end
Si está utilizando Rails 6.0+, puede ejecutar un comando generador de modelos como este:
bin/rails generate model Message images:attachments
Puedes crear un mensaje con imágenes:
class MessagesController < ApplicationController
def create
message = Message.create!(message_params)
redirect_to message
end
private
def message_params
params.require(:message).permit(:title, :content, images: [])
end
end
Use el método images.attach
para agregar nuevas imágenes a un mensaje existente:
@message.images.attach(params[:images])
Use el métodoimages.attached?
para determinar si un mensaje en particular tiene alguna imagen adjunta:
@message.images.attached?
El servicio predeterminado se realiza de la misma manera que has_one_attached
, usando la service
opción:
class Message < ApplicationRecord
has_many_attached :images, service: :s3
end
La configuración de variantes específicas se realiza de la misma manera que has_one_attached
, llamando al método variant
en el objeto adjunto generado:
class Message < ApplicationRecord
has_many_attached :images do |attachable|
attachable.variant :thumb, resize_to_limit: [100, 100]
end
end
Descarga de archivos
A veces es necesario procesar un blob después de cargarlo (por ejemplo, convertirlo a un formato diferente). Utilice el método del archivo adjunto download
para leer los datos binarios de un blob en la memoria:
binary = user.avatar.download