Debido a que Rails proporciona una estructura en términos de MVC, es natural terminar usando solo los contenedores de modelo, vista y controlador que se proporcionan para usted. El idioma típico para principiantes (e incluso algunos programadores intermedios) es incluir toda la lógica de la aplicación en el modelo (clase de base de datos), controlador o vista.
En algún momento, alguien señala el paradigma "modelo gordo, controlador delgado", y los desarrolladores intermedios eliminan rápidamente todo de sus controladores y lo tiran al modelo, que comienza a convertirse en un nuevo bote de basura para la lógica de la aplicación.
Los controladores flacos son, de hecho, una buena idea, pero el corolario: poner todo en el modelo, no es realmente el mejor plan.
En Ruby, tienes un par de buenas opciones para hacer las cosas más modulares. Una respuesta bastante popular es simplemente usar módulos (generalmente escondidos lib
) que contienen grupos de métodos, y luego incluir los módulos en las clases apropiadas. Esto ayuda en los casos en los que tiene categorías de funcionalidad que desea reutilizar en varias clases, pero donde la funcionalidad todavía está vinculada a las clases.
Recuerde, cuando incluye un módulo en una clase, los métodos se convierten en métodos de instancia de la clase, por lo que aún termina con una clase que contiene una tonelada de métodos, simplemente se organizan muy bien en varios archivos.
Esta solución puede funcionar bien en algunos casos; en otros casos, querrá pensar en usar clases en su código que no sean modelos, vistas o controladores.
Una buena manera de pensarlo es el "principio de responsabilidad única", que dice que una clase debería ser responsable de una sola (o pequeña cantidad) de cosas. Sus modelos son responsables de los datos persistentes de su aplicación a la base de datos. Sus controladores son responsables de recibir una solicitud y devolver una respuesta viable.
Si tiene conceptos que no encajan perfectamente en las cajas (persistencia, la petición / respuesta de gestión), es probable que quiera pensar acerca de cómo se podría modelar la idea de que se trate. Puede almacenar clases que no sean modelos en la aplicación / clases, o en cualquier otro lugar, y agregar ese directorio a su ruta de carga haciendo lo siguiente:
config.load_paths << File.join(Rails.root, "app", "classes")
Si está utilizando pasajero o JRuby, probablemente también desee agregar su ruta a las rutas de carga ansiosas:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
La conclusión es que una vez que llegas a un punto en Rails donde te encuentras haciendo esta pregunta, es hora de reforzar tus habilidades de Ruby y comenzar a modelar clases que no son solo las clases MVC que Rails te da por defecto.
Actualización: esta respuesta se aplica a Rails 2.xy superior.