En el mundo de Ruby on Rails, una de las primeras cosas que debes aprender son sus convenciones. Todo gira en torno a la idea de "convenciones sobre configuraciones".
Estas convenciones ayudan a que tu código sea más limpio, organizado y fácil de mantener.
¿Qué son los Controladores Flacos y los Modelos GORDOS?
Rails fomenta que los controladores sean flacos y los modelos sean gordos. Esto significa que:
- Los controladores deben contener solo el código necesario para manejar solicitudes HTTP y delegar la lógica a otros lugares.
- Los modelos deben manejar la lógica relacionada con los datos, pero sin llegar a estar sobrecargados de responsabilidades.
Sin embargo, en ocasiones, puedes necesitar escribir lógica que no encaja completamente en el modelo ni en el controlador. Esto puede llevar a:
- Controladores sobrecargados: Métodos (acciones) con muchas líneas de código que rompen la convención de "controladores flacos".
- Modelos obesos: Clases con demasiadas responsabilidades, difíciles de leer y mantener.
El Rescate: Plain Old Ruby Objects (PORO)
Aquí es donde entran los POROs (Plain Old Ruby Objects). Un PORO es una clase simple de Ruby que se usa para manejar lógica que no pertenece directamente al modelo ni al controlador. Los POROs son útiles para mantener el código limpio y organizado.
Ejemplo Práctico: Validar una Sesión de Usuario
Supongamos que necesitas validar si un usuario tiene una sesión activa. Sin un PORO, podrías hacerlo de esta manera:
Sin PORO:
class UsersController < ApplicationController
def show
if session[:user_id]
@user = User.find(session[:user_id])
else
redirect_to login_path, alert: "Inicia sesión primero."
end
end
end
En este caso, la lógica de validación está directamente en el controlador, lo cual puede hacer que crezca desordenadamente si agregas más reglas.
Con PORO: Primero, creamos un PORO para manejar esta lógica. Agreguemos una carpeta en app/models/users/ y creemos un archivo llamado valid.rb:
# app/models/users/valid.rb
module Users
class Valid
def self.validate_session(session)
return User.find(session[:user_id]) if session[:user_id]
nil
end
end
end
Luego, el controlador queda mucho más limpio:
class UsersController < ApplicationController
def show
@user = Users::Valid.validate_session(session)
redirect_to login_path, alert: "Inicia sesión primero." unless @user
end
end
Como puedes ver, el controlador ahora solo delega la lógica al PORO, manteniéndose "flaco".
¿Dónde Usar un PORO?
Un PORO no es solo para modelos. También puedes usarlo en controladores u otros lugares donde quieras separar la lógica de negocios. Colócalo en un lugar lógico dentro de tu estructura de carpetas, como cerca de los modelos relacionados.
Los POROs son una excelente forma de mantener tus controladores y modelos organizados. Siguiendo las convenciones de Rails, leyendo buenas prácticas y aplicando los principios SOLID, puedes escribir código más limpio, comprensible y mantenible.
¡Recuerda siempre compartir este conocimiento y ayudar a otros desarrolladores a mejorar su flujo de trabajo en Ruby on Rails! 🚀