Cómo Crear un Controlador Genérico para Subir Archivos con CarrierWave en Rails

En este artículo, aprenderemos a crear un controlador genérico en Ruby on Rails que permita subir archivos utilizando CarrierWave. Este controlador será capaz de manejar múltiples uploaders y se podrá reutilizar en varios formularios dentro de nuestra aplicación.


1. Configuración Inicial

Antes de empezar, asegúrate de tener instalado CarrierWave en tu aplicación Rails. Si aún no lo has hecho, puedes agregarlo a tu Gemfile y ejecuta bundle install:

gem ‘carrierwave’

Luego, genera un uploader para tus archivos:

rails generate uploader FileUploader

class StorageController < ApplicationController
  def send_post
    if params[:file].present? && params[:modelo].present? && params[:uploader].present?
      uploader = params[:uploader]
      begin
        @modelo = params[:modelo].constantize.find(params[:id])
        @modelo.send("#{uploader}=", params[:file])
        if @modelo.save
          logger.debug @modelo.send(uploader).url
          logger.debug @modelo.send(uploader).current_path
          logger.debug @modelo.send(uploader).filename
          render json: @modelo, status: :ok, location: @modelo
        else
          render json: { error: 'No se pudo guardar el modelo' }, status: :unprocessable_entity
        end
      rescue NameError => e
        logger.error "Modelo no válido: #{params[:modelo]}"
        render json: { error: "Modelo no válido: #{params[:modelo]}" }, status: :unprocessable_entity
      rescue NoMethodError => e
        logger.error "Método no válido: #{uploader}"
        render json: { error: "Método no válido: #{uploader}" }, status: :unprocessable_entity
      end
    else
      render json: { error: 'Parámetros faltantes' }, status: :unprocessable_entity
    end
  end
end

Configuración de Rutas

Rails.application.routes.draw do
  match 'storage/:modelo/:id/:uploader', to: 'storage#send_post', via: [:post]
end
Formularios de Subida de Archivos

Para que esta configuración funcione con múltiples uploaders y formularios, asegúrate de que tus formularios envíen los parámetros modelo, id, uploader, y file correctamente. Aquí tienes un ejemplo de cómo se vería un formulario:

<%= form_with url: storage_path(modelo: ‘YourModel’, id: @your_model.id, uploader: ‘your_uploader’), local: true, html: { multipart: true } do |form| %>

<%= form.label :file %> <%= form.file_field :file %>

<%= form_with url: storage_path(modelo: 'YourModel', id: @your_model.id, uploader: 'your_uploader'), local: true, html: { multipart: true } do |form| %>
  <div class="field">
    <%= form.label :file %>
    <%= form.file_field :file %>
  </div>
  <div class="actions">
    <%= form.submit 'Upload' %>
  </div>
<% end %>

En este artículo, hemos creado un controlador genérico para subir archivos en una aplicación Rails utilizando CarrierWave. Este enfoque permite manejar múltiples uploaders y facilita la reutilización del código en varios formularios, haciendo tu aplicación más modular y mantenible.

Con estos pasos, deberías tener una solución robusta y flexible para manejar subidas de archivos en tu aplicación Rails. ¡Feliz codificación!

Leave a Reply

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