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!