Étant donné que Rails fournit une structure en termes de MVC, il est naturel de n'utiliser que les conteneurs de modèle, de vue et de contrôleur qui vous sont fournis. L'idiome typique pour les débutants (et même certains programmeurs intermédiaires) consiste à entasser toute la logique de l'application dans le modèle (classe de base de données), le contrôleur ou la vue.
À un moment donné, quelqu'un souligne le paradigme "modèle gras, contrôleur maigre", et les développeurs intermédiaires excisent tout à la hâte de leurs contrôleurs et le jettent dans le modèle, qui commence à devenir une nouvelle poubelle pour la logique d'application.
Les contrôleurs maigres sont, en fait, une bonne idée, mais le corollaire - tout mettre dans le modèle, n'est pas vraiment le meilleur plan.
Dans Ruby, vous avez quelques bonnes options pour rendre les choses plus modulaires. Une réponse assez populaire consiste à simplement utiliser des modules (généralement cachés lib
) qui contiennent des groupes de méthodes, puis à inclure les modules dans les classes appropriées. Cela aide dans les cas où vous avez des catégories de fonctionnalités que vous souhaitez réutiliser dans plusieurs classes, mais où la fonctionnalité est toujours théoriquement attachée aux classes.
N'oubliez pas que lorsque vous incluez un module dans une classe, les méthodes deviennent des méthodes d'instance de la classe, vous vous retrouvez donc avec une classe contenant une tonne de méthodes, elles sont simplement bien organisées en plusieurs fichiers.
Cette solution peut bien fonctionner dans certains cas - dans d'autres cas, vous allez vouloir penser à utiliser des classes dans votre code qui ne sont pas des modèles, des vues ou des contrôleurs.
Une bonne façon d'y penser est le «principe de responsabilité unique», qui dit qu'une classe devrait être responsable d'un seul (ou petit nombre) de choses. Vos modèles sont responsables de la persistance des données de votre application vers la base de données. Vos contrôleurs sont responsables de la réception d'une demande et du retour d'une réponse viable.
Si vous avez des concepts qui ne correspondent pas parfaitement dans ces boîtes (persistance, demande / gestion de réponse), vous voulez sans doute penser à la façon dont vous voulez modéliser l'idée en question. Vous pouvez stocker des classes non modèles dans app / classes, ou n'importe où ailleurs, et ajouter ce répertoire à votre chemin de chargement en procédant comme suit:
config.load_paths << File.join(Rails.root, "app", "classes")
Si vous utilisez passager ou JRuby, vous souhaiterez probablement également ajouter votre chemin aux chemins de chargement désireux:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
L'essentiel est qu'une fois que vous arrivez à un point dans Rails où vous vous trouvez à poser cette question, il est temps de renforcer vos côtelettes Ruby et de commencer à modéliser des classes qui ne sont pas seulement les classes MVC que Rails vous donne par défaut.
Mise à jour: cette réponse s'applique à Rails 2.x et supérieur.