Active Storage - Como activarlo y usarlo

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

  • poppler o muPDF para vistas previas de PDF

El análisis y las transformaciones de imágenes también requieren de la image_processinggema. Descomentelo en su Gemfileo 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_attachmentses 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 subyacente record_typeal 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, testy 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.ymlarchivo (si existe) tendrá prioridad sobre el config/storage.ymlarchivo.

Se recomienda utilizarlo Rails.enven 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-s3gema a tu Gemfile:

gem "aws-sdk-s3", require: false

Las funciones principales de Active Storage requieren los siguientes permisos: s3:ListBucket, s3:PutObject, s3:GetObjecty s3:DeleteObject. El acceso público requiere adicionalmente s3: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