2017-08-18 2 views
1

Ich arbeite mit einer Grape-API und ich habe Modelle, die ein URL-Attribut haben, mit dem ich Endpunkte für dynamisch zu mounten. Ich muss in der Lage sein, sie zu versionieren, und ich habe Probleme, sie zu erhalten, um richtig benannt zu werden, wenn sie erzeugt werden.Erstellen Sie dynamisch benannte Klasse in Modul-Namespace

Wenn ich eine Klasse innerhalb eines Moduls erstellen, ist diese Klasse Namespace.

module MyModule 
    module SubModule 
    class MyClass 
    end 
    end 
end 
=> nil 
MyModule::SubModule::MyClass 
=> MyModule::SubModule::MyClass 

Wenn ich jedoch dynamisch die Klasse innerhalb eines Moduls erstellen, ist es nicht Namespace.

module MyModule 
    module SubModule 
    dynamic_name = "ClassName" 
    Object.const_set(dynamic_name, Class.new) 
    end 
end 
=> ClassName 
MyModule::SubModule::ClassName 
NameError: uninitialized constant MyModule::SubModule::ClassName 
ClassName 
=> ClassName 

Gibt es eine Möglichkeit, Namespace eine dynamisch erstellte Klasse?

+0

Sie können einfach 'const_set', keine Notwendigkeit für' Object.' –

+0

Nun, Sie * explizit * Ruby die Konstante in 'Objekt zu setzen, was haben Sie erwartet? Sie können * explizit * Ruby mitteilen, die Konstante an anderer Stelle in genau der gleichen Weise * zu setzen. –

+0

Danke Max! Jörg, du hast recht, aber in diesem Fall hat Max den Nagel auf den Kopf getroffen. Ich hätte es im aktuellen Umfang einstellen sollen. –

Antwort

1

Object.const_set legt die Konstante explizit im Namespace Objekt fest, bei dem es sich um den Stammnamespace handelt. Wenn Sie const_set ohne Object verwenden, wird die Konstante in dem aktuellen Namespace festgelegt, der in Ihrem Beispiel MyModule::SubModule ist.

Verwandte Themen