Rails ActiveStorage

Rails ActiveStorage

enmanuelm19@gmail.com2018-06-25 20:19:04 UTC

Rails ActiveStorage


ActiveStorage es la solución nativa del framework Rails para el manejo de archivos presente desde la versión 5.2, antes de esta versión solo era posible con gemas de terceros como Paperclip o Carrierwave, ahora viene integrado por defecto.

Para empezar a hacer uso de esta nueva característica colocamos el siguiente comando desde nuestra aplicación:

railg g active_storage:install

Este comando creara las migraciones necesarias para persistir la información de nuestros archivos. Para agregar un archivo adjunto a unos de nuestros modelos solo debemos colocar lo siguiente:

class Post < ApplicationRecord
  # Si solo necesitamos un archivo adjunto
  has_one_attached :image

    # Si necesitamos mas de un archivo adjunto
  has_many_attached :images
end

Luego de configurar los archivos adjuntos a su respectivo modelo, ingresaremos el nuevo atributo a la "lista blanca" de los parametros en el controlador y haremos los cambios respectivos en los formularios:

class PostsController < ApplicationController
  ...
    def post_params
      params.require(:post).permit(:name, :image, images: [])
    end
end
# slim
=  form_for @post do |f|
  = f.file_field :image
    = f.file_field :images, multiple: true

# erb
<%= form_for @post do |f| %>
  <%=  f.file_field :image %>
    <%= f.file_field :images, multiple: true %>
<%= end %>

Para extraer las imágenes y mostrarlas dentro de nuestra aplicación solo basta escribir lo siguiente(suponiendo que el archivo adjunto es una imagen):

#slim
- if @post.image.attached?
  = image_tag(@post.image)

#erb
<% if @post.image.attached %>
  <%= image_tag(@post.image) %>
<% end %>

# Para las imágenes multiples solo hace falta iterar por ellas
- @post.images.each do |image|

# Para mostrarlos las imágenes en una nueva pestaña
= link_to image_tag(@post.image), @post.image, target: '_blank'

<%= link_to image_tag(@post.image), @post.image, target: '_blank' %>

# Para descargar los archivos en vez de mostrarlos
= link_to @post.image.filename, rails_blob_path(@post.image, disposition: :attachment)

<%= link_to @post.image.filename, rails_blob_path(@post.image, disposition: :attachment)
ActiveStorage y Amazon S3

S3 es un servicio de almacenamiento de archivos que presta Amazon, en esta sección veremos como integrar ActiveStorage para almacenar nuestras imágenes, documentos o archivos adjuntos en el servicio de Amazon.

  1. Crear cuenta en Amazon Primero que todo necesitas crearte una cuenta en Amazon Web Services y seguir los pasos que allí te indican.

  2. Crear bucket de S3 Para crear un bucket ubicamos en el menú de servicios el servicio de S3, y luego hacemos clic en el botón Crear bucket Crear bucket

    Luego de crear nuestro bucket, para no tener problemas con acceder desde nuestra aplicación a los archivos configuramos los CORS CORS

  3. Configurar la aplicación.

    Añadimos la gema aws-sdk-s3 a nuestro Gemfile:

    gem 'aws-sdk-s3', required: false
    

    Dentro de el archivo config/storage.yml colocamos lo siguiente:

    amazon:
        service: S3
        access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
        secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
        region: us-la_region_que_configuraste
        bucket: nombre-bucket
    

    Como pueden observar hacemos uso de las credenciales de Rails, para sabes como utilizarlas puedes revisar Rails credentials.

    Asegurarnos de tener incluido el Javascript necesario para ActiveStorage en app/assets/javascripts/application.js

    //= require activestorage
    

    Indicarle a nuestra aplicación que servicio va a usar para almacenar nuestros archivos, si lo quieres probar en desarrollo se coloca en config/environments/development.rb y por supuesto en config/enviroments/production.rb

    config.active_storage.service = :amazon
    

Y listo ya habremos integrado ActiveStorge con Amazon S3


Cualquier consejo, corrección o duda puedes comentar abajo.


Compartir