2016-10-03 3 views
2

In meinem Rails-Projekt möchte ich alle Module, die im Modul A geschachtelt sind, erhalten.Ruby on Rails: Get verschachtelte Module?

Die Datei lib/assets/a/b.rb, besteht aus:

module A 
    module B 
    end 
end 

In der Rails-Konsole:

A.constants 
    => [] 
A::B.class 
    => Module 
A.constants 
    => [:B] 

Warum ist die erste Zeile ein leeres Array zurückkehrt, und wie Bekomme ich das Problem?

Antwort

0

Das ist, weil wie Autoloading Rails funktioniert.

Wenn Sie A.constants aufrufen Rails finden A in der Datei a.rb und erhalten Sie die dort definierten Konstanten. Wie es scheint, hast du dort keine Konstante definiert, es ist das leere Array.

Wenn Sie anrufen A::B.class Schienen Autoloading sucht nach A::B und laden a/b.rb. Wenn Sie also das nächste Mal A.constants aufrufen, werden die Konstanten zurückgegeben, die sowohl in a.rb als auch in a/b.rb definiert sind, da beide Dateien jetzt geladen sind. Und deshalb gibt es das zweite Mal B zurück.

So können Sie das Problem nicht lösen. Dies wird erwartet, da es darauf zurückzuführen ist, wie das Autoloading von Rails funktioniert.

Auch Sie sagen, dass Ihre Modelle in lib/assets/ sind, aber das macht keinen Unterschied, da es das gleiche wäre, wenn sie in models/ wären.

+0

Ich fürchte, es gibt keine a.rb-Datei, also ist dies nicht die Antwort. Alles, was Sie brauchen, um zu replizieren, was ich in der Rails-Konsole gemacht habe, ist in der Frage (d. H. Der Ordner 'a', mit der Datei 'b.rb' wie gezeigt). –