Cómo Crear un controlador generico para descargar de archivos subidos con CarrierWave, en Ruby On Rails

Trabajar con la subida y descarga de archivos en nuestras aplicaciones es una tarea común. Personalmente, prefiero utilizar un controlador genérico y dinámico para gestionar las descargas, ya que esto me permite, desde una misma clase, llevar un registro detallado de quién, cuándo y qué archivos se descargan. Además, puedo incluir estadísticas y medidas de seguridad adicionales. En este artículo, compartiré el código para implementar un controlador genérico de descargas en Rails.


El Controlador de Descargas

El siguiente código muestra cómo crear un controlador genérico para gestionar descargas de archivos en Rails:

class DescargarController < ApplicationController
def index
modelo = params[:modelo].classify
id = params[:id]
archivo = params[:archivo]
registro = modelo.constantize.find(id)
archivo_uploader = registro.send(archivo)

if archivo_uploader.present?
send_file archivo_uploader.current_path, filename: archivo_uploader.file.filename, type: archivo_uploader.file.content_type, disposition: 'attachment'
else
render plain: "Archivo no encontrado", status: :not_found
end
end
end

Configuración de las Rutas

Para que las solicitudes de descarga sean manejadas correctamente, agrega la siguiente ruta en tu archivo config/routes.rb:

match 'descargar/:modelo/:id/:archivo', to: 'descargar#index', via: [:get]

Enlace en la Vista

En la vista, puedes mostrar el enlace de descarga utilizando el siguiente código:

<a href="<%= @archivo.estadistica.descarga_url %>">Descargar archivo</a>

Método Personalizado en el Uploader

Agrega un método en tu uploader para personalizar el enlace de descarga en la aplicación. Aquí tienes un ejemplo:

class EstadisticaUploader < CarrierWave::Uploader::Base
def descarga_url
"/descargar/#{model.class}/#{model.id}/#{mounted_as}"
end
end

Conclusión

Con este controlador genérico, puedes gestionar fácilmente las descargas de archivos en tu aplicación Rails. Esto no solo simplifica el código, sino que también te permite agregar funcionalidades adicionales como estadísticas y seguridad. Espero que este artículo te haya sido útil y te animes a implementar esta solución en tus proyectos.

Leave a Reply

Your email address will not be published. Required fields are marked *