RoR: MyModel.descendants gibt [] in einer Ansicht nach dem ersten Aufruf zurück?

8

Ich möchte eine Auswahlliste von MyModel-Unterklassen in einer Ansicht anzeigen. Es funktioniert noch nicht, also habe ich das aus meiner Sicht zur Überprüfung der Gesundheit hinzugefügt:

%Vor%

Die erste Zeit rendere ich diese Seite nach dem Neustart des Servers, es zeigt die Liste der Nachkommen (es gibt sechs). Alle nachfolgenden -Zeiten werden als leere Liste [] angezeigt.

FWIW, ich habe eine require -Anweisung in meinen Initializern:

%Vor%

... und ich habe festgestellt, dass sie benötigt werden.

Was ist das @ ($% & amp; läuft?

    
fearless_fool 04.05.2011, 18:38
quelle

3 Antworten

7

Wenn Sie require verwenden, benötigt der Kernel nicht Ihre Unterklassen my_model.rb , auch wenn Ihr .rb neu geladen wird, da diese bereits geladen wurden. Du müsstest durch Autoload-Schienen gehen.

Bei Ihrer ersten Anfrage werden die Autoloads " MyModel " von " my_model.rb " automatisch aufgerufen, was dann my_models/sub_model.rb erfordert. Die Klasse SubModel erbt MyModel , die das Array descendants auffüllt. Bei den folgenden Anfragen wird autodes MyModel jedoch erneut geladen (hey, du bist im Dev-Modus), was wiederum my_models/sub_model.rb erfordert. Aber diesmal weiß der Kernel, dass er diese Datei bereits geladen hat und lädt sie nicht erneut.

Ich bin vor einer Stunde auf dieses Problem gestoßen, das mich zu Ihrem Posten geführt hat und eine Lösung gefunden hat. Was wir brauchen, sind Schienen, um Unterklassen bei jedem Aufruf der Hauptklasse automatisch zu laden.

Hier ist eine Lösung:

%Vor%

Diese Zeilen könnten wahrscheinlich außerhalb der Klasse platziert werden. Das sollte genug sein (es ist für mich), wenn Sie nur Dateien in my_models und nicht in Unterverzeichnissen haben. Wenn Sie etwas haben (zum Beispiel MyModels::Car::Ford , müssen Sie möglicherweise die gleiche Art von Zeug in die Submodule einfügen (in my_models/car.rb ).

    
Wam 06.05.2011, 21:38
quelle
9

Ich hatte das gleiche Problem. Habe es gelöst, indem ich config/initializers/preload_models.rb mit hinzugefügt habe:

%Vor%

Hoffe, dass es jemandem hilft.

    
behe 12.03.2012 20:09
quelle
7

Ich habe gerade das eifrige Laden in jeder Umgebung aktiviert:

config.eager_load = true

Dies funktionierte für mich auch bei der Verwendung von Namensräumen für Klassennamen.

    
mscriven 16.06.2015 15:42
quelle

Tags und Links