Schienen: Elegante Möglichkeit, Modelle in Unterordnern zu strukturieren, ohne Submodule zu erstellen
Habe ich zahlreiche Modelle in meiner app/models Ordner. Ich möchte zum reinigen dieser Ordner sich ein wenig. Verschieben von Modellen, die zueinander gehören in den Unterordner. Das problem ist, dass durch das übereinkommen die model-Klasse ist in einem Namespace befinden, in einem entsprechenden Modul.
E. g.
app/models/blog/post.rb
app/models/blog/Kommentar.rb
app/models/user.rb
so, dass:
app/models/blog/post.rb
class Post < ActiveRecord
end
und nicht
class Blog::Post < ActiveRecord
end
InformationsquelleAutor der Frage seb | 2009-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was ich für Rails 3:
Diese Konfiguration informiert Schienen zur überprüfung aller app/models Unterordner rekursiv und laden alle gefundenen Modelle. Keine Verwendung von Namensräumen benötigt.
InformationsquelleAutor der Antwort Ion Br.
Brauchten wir, um dies zu tun, und es ist eine sehr einfache Art und Weise.
bewegen Sie Ihre Modelle in die sub-Ordner, und dann sagen Schienen zum laden von Dateien aus allen Unterordnern in Ihrer Umgebung.rb-Datei:
Keine Verwendung von Namensräumen benötigt und die Modelle können bezeichnet werden als normal in Ihre app
InformationsquelleAutor der Antwort Tilendor
Ich auch Unterordner erstellt, und dann die folgenden auf die Anwendung.rb-Datei:
Aber auf diese Weise allein ist nicht genug, wenn Unterordner, benannt mit dem gleichen Namen wie ein Modell (z.B. ein Ordner "user" enthält mehrere Dateien, von denen eine ist 'Benutzer'). Dies verursacht alle Arten von Fehlern in meinem code, bis ich fand, dass es gelöst werden könnte, indem Sie einfach die Ordner-Namen, die sind anders als die Modelle (z.B., 'user-Modelle"), die Sie enthalten. Ich fand den Vorschlag auf http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/, die eigentlich Punkte auf diese Frage.
InformationsquelleAutor der Antwort pickwick
So, ich verwendet, um in Rails 2 ist etwas wie dieses:
Und die folgenden Dateien:
class User::Base
class User::Admin
Wenn ich ein Upgrade auf Rails 3, ich habe immer ein Fehler entlang dieser Linien:
Expected .../app/models/user/foo.rb to define Foo
. Das ist eindeutig schien verrückt seit Rails 2 ist, wird davon ausgegangen, dass das, was Sie in user/foo.rb wäreUser::Foo
nicht nurFoo
.So, wie ich landete Lösung dieser war loszuwerden Modell Unterverzeichnisse in
autoload_paths
und tun so etwas wie dieses:Ich erstellte app/models/user.rb:
InformationsquelleAutor der Antwort Aaron Gibralter
Vielleicht kann man sich auf RailsEngines. Es ist nicht genau das, was Sie brauchen, aber konnte gab Ihnen einige Ideen.
Andere als, dass, wenn Ihr Skript scheint gut zu funktionieren (man könnte auch einfach Lesen, alle Dateien auf die einzelnen Unterordner nach Modell und benötigen Sie), sehe ich keine problem gegen ihn.
InformationsquelleAutor der Antwort Yaraher
diese version von Tilendor die Lösung funktioniert mit Rails 3
config.load_paths und RAILS_ROOT sind deprecated in Rails 3, auch sollte man es in der config-block der config/application.rb, nicht die Umgebung.rb
InformationsquelleAutor der Antwort chris_b
In meinem Rails 3.2.3 app, nachdem ich zog einige Modelle zu Unterverzeichnissen, habe ich stolperte in Fehler wie
Verein fordert (Beispiel: Projekt.erste.project_category).
In der Ende, der workaround den ich gefunden war, war die :class_name für jeden Verein zu Modell im Unterverzeichnis...
":: "- Teil hier Punkte zu Schienen, dass ProjectCategory Modell hat keinen namespace, trotz der Tatsache, dass definiert wird, in eine 'models/project' - Unterverzeichnis.
InformationsquelleAutor der Antwort Tim Zaripov
Dieser arbeitete für mich in Schienen 5.
Hinzufügen folgender
application.rb
Aber Vorsicht, Sie können nicht den gleichen Namen in Ihrem Ordner als jedes Ihrer Modelle.
InformationsquelleAutor der Antwort Fellow Stranger
Bis ich eine bessere Lösung habe ich einen init.rb app/models Ordner:
app/models/init.rb
Server den Zweck, bis jetzt.
InformationsquelleAutor der Antwort seb
Alle oben genannten Antworten waren nicht für mich arbeiten. Irgendwie "models" - Ordner geladen wurde, mit Unterordnern, die zu 'enthalten soll ::.
Meisten meiner Unterverzeichnisse, wurden STI-Klassen, so habe ich zog Sie zu app/models_sti//*. Dann alles, was ich tun musste, war, in
application.rb
InformationsquelleAutor der Antwort Kangur