Como Rails proporciona estructura en términos de MVC, es natural terminar usando solo el modelo, los contenedores de modelo, vista y controlador que se le proporcionan. La expresión típica para principiantes (e incluso algunos programadores intermedios) es meter 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 del "modelo gordo, controlador delgado", y los desarrolladores intermedios eliminan rápidamente todo de sus controladores y lo lanzan al modelo, que comienza a convertirse en un nuevo bote de basura para lógica de aplicación .
Los controladores delgados son, de hecho, una buena idea, pero el corolario: poner todo en el modelo, no es realmente el mejor plan.
En Ruby, tiene un par de buenas opciones para hacer las cosas más modulares. Una respuesta bastante popular es simplemente usar módulos (generalmente escondidos en lib
) que contienen grupos de métodos, y luego incluir los módulos en las clases apropiadas. Esto ayuda en los casos en que tiene categorías de funcionalidad que desea reutilizar en múltiples 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 ton de métodos, simplemente están organizados en múltiples 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 pensar sobre esto es el "principio de responsabilidad única", que dice que una clase debe ser responsable de un único (o pequeño número) de cosas. Sus modelos son responsables de la persistencia de los datos de su aplicación en 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 esos cuadros (persistencia, gestión de solicitud/respuesta), probablemente desee pensar en cómo sería modelar la idea en cuestión. Puede almacenar clases no modelo en app/clases, o en cualquier otro lugar, y añadir ese directorio a la ruta de carga haciendo:
config.load_paths << File.join(Rails.root, "app", "classes")
Si está utilizando pasajero o JRuby, es probable que también desea agregar su camino a las rutas de carga ansiosos:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
La línea de fondo es que una vez que se llega a un punto en Rails donde usted se encuentra haciendo esta pregunta, es el momento de reforzar sus chuletas de Ruby y comenzar las clases de modelado que aren No son solo las clases de MVC que Rails te da por defecto.
Actualización: Esta respuesta se aplica a Rails 2.xo superior.
D'oh. No se me había ocurrido agregar un directorio separado para los que no eran Modelos. Puedo sentir que viene un tidy-up ... –
Yehuda, gracias por eso. Gran respuesta.Eso es exactamente lo que estoy viendo en las aplicaciones que heredé (y las que hago): todo en los controladores, modelos, vistas y los ayudantes proporcionados automáticamente para los controladores y las vistas. Luego vienen los mixins de lib, pero nunca hay un intento de hacer modelos reales de OO. Sin embargo, tienes razón: en "aplicaciones/clases o en cualquier otro lugar". Solo quería comprobar si faltaba alguna respuesta estándar ... –
Con versiones más recientes, config.autoload_paths se establece de manera predeterminada en todos los directorios en la aplicación. Por lo tanto, no necesita cambiar config.load_paths como se describe arriba. No estoy seguro acerca de eager_load_paths (yet) embargo, y necesito investigar eso. ¿Alguien ya lo sabe? –