Da Rails eine Struktur in Bezug auf MVC bietet, werden natürlich nur die für Sie bereitgestellten Modell-, Ansichts- und Controller-Container verwendet. Die typische Redewendung für Anfänger (und sogar einige fortgeschrittene Programmierer) besteht darin, die gesamte Logik in der App in das Modell (Datenbankklasse), den Controller oder die Ansicht zu packen.
Irgendwann weist jemand auf das Paradigma "Fettmodell, Skinny-Controller" hin, und fortgeschrittene Entwickler entfernen hastig alles von ihren Controllern und werfen es in das Modell, das zu einem neuen Mülleimer für die Anwendungslogik wird.
Dünne Controller sind in der Tat eine gute Idee, aber die Konsequenz - alles in das Modell zu integrieren - ist nicht wirklich der beste Plan.
In Ruby haben Sie einige gute Möglichkeiten, die Dinge modularer zu gestalten. Eine ziemlich beliebte Antwort ist, nur Module zu verwenden (normalerweise versteckt lib
), die Gruppen von Methoden enthalten, und die Module dann in die entsprechenden Klassen aufzunehmen. Dies ist hilfreich, wenn Sie über Funktionskategorien verfügen, die Sie in mehreren Klassen wiederverwenden möchten, die Funktionalität jedoch noch fiktiv an die Klassen gebunden ist.
Denken Sie daran, wenn Sie ein Modul in eine Klasse aufnehmen, werden die Methoden zu Instanzmethoden der Klasse, sodass Sie immer noch eine Klasse mit einer Vielzahl von Methoden erhalten. Sie sind nur gut in mehrere Dateien organisiert.
Diese Lösung kann in einigen Fällen gut funktionieren. In anderen Fällen sollten Sie darüber nachdenken, Klassen in Ihrem Code zu verwenden, die keine Modelle, Ansichten oder Controller sind.
Eine gute Möglichkeit, darüber nachzudenken, ist das "Prinzip der Einzelverantwortung", das besagt, dass eine Klasse für eine einzelne (oder eine kleine Anzahl) von Dingen verantwortlich sein sollte. Ihre Modelle sind dafür verantwortlich, dass Daten aus Ihrer Anwendung in der Datenbank gespeichert werden. Ihre Controller sind dafür verantwortlich, eine Anfrage zu erhalten und eine brauchbare Antwort zurückzugeben.
Wenn Sie Konzepte haben, die nicht genau in diese Felder passen (Persistenz, Anforderungs- / Antwortverwaltung), möchten Sie wahrscheinlich darüber nachdenken, wie Sie die betreffende Idee modellieren würden . Sie können Nichtmodellklassen in App / Klassen oder an einer anderen Stelle speichern und dieses Verzeichnis Ihrem Ladepfad hinzufügen, indem Sie Folgendes tun:
config.load_paths << File.join(Rails.root, "app", "classes")
Wenn Sie Passagier oder JRuby verwenden, möchten Sie wahrscheinlich auch Ihren Pfad zu den eifrigen Ladepfaden hinzufügen:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
Das Fazit ist, dass es an der Zeit ist, Ihre Ruby-Chops zu verbessern und Klassen zu modellieren, die nicht nur die MVC-Klassen sind, die Rails Ihnen standardmäßig zur Verfügung stellt, sobald Sie einen Punkt in Rails erreicht haben, an dem Sie diese Frage stellen.
Update: Diese Antwort gilt für Rails 2.x und höher.