Parce que les Rails fournit la structure en termes de MVC, il est naturel de se finissent en utilisant seulement le modèle, vue, contrôleur et les conteneurs qui sont fournis pour vous. Le typique idiome pour les débutants (et même certains intermédiaires programmeurs) est à fourrer toute logique dans l'application dans le modèle (classe de base de données), de contrôleur ou de vue.
À un certain moment, quelqu'un fait remarquer le "gras-modèle, skinny-contrôleur" changement de paradigme, les intermédiaires et les développeurs hâte d'accise tout, de leurs contrôleurs et de le jeter dans le modèle, ce qui commence à devenir une nouvelle corbeille pour la logique d'application.
Skinny contrôleurs sont, en fait, une bonne idée, mais le corollaire, mettant tout dans le modèle, n'est pas vraiment le meilleur plan.
En Ruby, vous avez un couple de bonnes options pour rendre les choses plus modulaire. Un assez populaire de réponse est d'utiliser des modules (généralement planqué en lib
) qui détiennent des groupes de méthodes, et puis d'inclure les modules dans les classes appropriées. Cela aide dans le cas où vous avez des catégories de fonctionnalités que vous souhaitez réutiliser dans plusieurs classes, mais où la fonctionnalité est toujours en théorie, attaché à la les classes.
Rappelez-vous, lorsque vous inclure un module dans une classe, les méthodes les méthodes d'instance de la classe, si vous avez encore jusqu'à la fin avec une classe contenant une tonne de méthodes, ils sont juste bien organisé en plusieurs fichiers.
Cette solution peut bien fonctionner dans certains cas, dans d'autres cas, vous allez avoir à penser à l'aide de classes dans votre code qui ne sont pas des modèles, vues et contrôleurs.
Une bonne façon de penser, c'est que le "principe de responsabilité unique," qui dit qu'une classe doit être responsable pour une seule personne (ou un petit nombre) des choses. Vos modèles sont responsables de la persistance des données à partir de votre application à la base de données. Vos contrôleurs sont responsables de la réception et de la demande et de renvoyer une réponse viable.
Si vous avez des concepts qui n'entrent pas dans les cases (persistance, à la demande/réponse de la direction), vous avez certainement envie de penser à comment vous serait le modèle de l'idée en question. Vous pouvez stocker des classes de modèle dans app/classes, ou n'importe où ailleurs, et ajouter ce répertoire à votre charge chemin en faisant:
config.load_paths << File.join(Rails.root, "app", "classes")
Si vous êtes à l'aide de passagers ou de JRuby, vous avez probablement vous aussi vous souhaitez ajouter votre chemin à la hâte les chemins de chargement:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
La ligne de fond est que, une fois que vous arrivez à un point dans les Rails où vous vous posez cette question, il est temps de renforcer votre Ruby de côtelettes et de commencer la modélisation de classes qui ne sont pas seulement les classes MVC Rails, vous donne par défaut.
Mise à jour: Cette réponse s'applique aux Rails 2.x et supérieur.