Da Rails Struktur in Bezug auf MVC bietet, ist es natürlich, nur die Modell-, Ansichts- und Controller-Container zu verwenden, die für Sie bereitgestellt werden. Das typische Idiom 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 stopfen.
An einem gewissen Punkt, weist jemand das „Fett-Modell, Skinny-Controller“ Paradigma und Zwischen Entwicklern in aller Eile Verbrauch alles von ihren Controllern und es in das Modell werfen, die eine neue Mülltonne für die Anwendungslogik zu werden beginnt, .
Skinny Controller sind in der Tat eine gute Idee, aber die logische Folge - alles in das Modell zu setzen, ist nicht wirklich der beste Plan.
In Ruby haben Sie ein paar gute Möglichkeiten, die Dinge modularer zu gestalten. Eine ziemlich populäre Antwort besteht darin, einfach Module zu verwenden (normalerweise in lib
gespeichert), die Gruppen von Methoden enthalten, und dann die Module in die entsprechenden Klassen aufzunehmen. Dies hilft in Fällen, in denen Sie Funktionskategorien haben, die Sie in mehreren Klassen wiederverwenden möchten, bei denen die Funktionalität jedoch fiktiv noch den Klassen zugeordnet ist.
Denken Sie daran, wenn Sie ein Modul in eine Klasse gehören, werden die Methoden Instanzmethoden der Klasse, so dass Sie immer noch mit einer Klasse, die eine Tonne von Methoden am Ende, sind sie gut in mehrere Dateien einfach 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 nicht Modelle, Ansichten oder Controller sind.
Ein guter Weg, darüber nachzudenken, ist das "Prinzip der einheitlichen Verantwortung", das besagt, dass eine Klasse für eine einzelne (oder kleine) Anzahl von Dingen verantwortlich sein sollte. Ihre Modelle sind verantwortlich für das Fortbestehen von Daten aus Ihrer Anwendung in der Datenbank. Ihre Controller sind für das Empfangen einer Anfrage und das Zurückgeben einer brauchbaren Antwort verantwortlich.
Wenn Sie Konzepte haben, die nicht sauber in diese Boxen (Persistenz, Anfrage/Antwort-Management) passen, möchten Sie wahrscheinlich darüber nachdenken, wie Sie modellieren die Idee in Frage. Sie können nicht-Modellklassen in app/Klassen speichern, oder anderswo, und das Verzeichnis auf Ihrem Lastpfad hinzufügen, indem Sie:
config.load_paths << File.join(Rails.root, "app", "classes")
Wenn Sie Passagier oder JRuby verwenden, werden Sie wahrscheinlich wollen auch Ihre hinzufügen Pfad zu den eifrigen Lastpfaden:
config.eager_load_paths << File.join(Rails.root, "app", "classes")
Die bottom-Line ist, dass, wenn Sie in Rails zu einem Punkt, wo man sich diese Frage finden, ist es Zeit, Ihr Ruby-Koteletts, Rindfleisch und Modellierung von Klassen zu starten, die aren Es sind nicht nur die MVC-Klassen, die Rails standardmäßig zur Verfügung stellt.
Aktualisierung: Diese Antwort bezieht sich auf Rails 2.x und höher.
D'oh. Das Hinzufügen eines separaten Verzeichnisses für Nicht-Modelle war mir nicht eingefallen. Ich kann ein Aufräumen spüren ... –
Yehuda, danke dafür. Gute Antwort.Genau das sehe ich in den Apps, die ich erben (und die, die ich mache): alles in Controllern, Modellen, Ansichten und den Helfern, die automatisch für Controller und Ansichten bereitgestellt werden. Dann kommen die Mixins von lib, aber es gibt nie einen Versuch, echte OO-Modellierung zu machen. Du hast aber Recht: in "Apps/Klassen oder irgendwo anders." Ich wollte nur nachsehen, ob es eine Standardantwort gibt, die ich vermisse ... –
Bei neueren Versionen sind in config.autoload_paths standardmäßig alle Verzeichnisse unter App. Sie müssen also nicht wie oben beschrieben config.load_paths ändern. Ich bin jedoch nicht sicher über eager_load_paths (noch) und muss mich darum kümmern. Weiß jemand schon? –