2017-08-18 4 views
1

Je travaille avec une API Grape et j'ai des modèles qui ont un attribut url que j'utilise pour monter dynamiquement des points de terminaison. Je dois pouvoir les modifier et j'ai de la difficulté à les faire correctement enregistrer quand ils sont générés.Création d'une classe nommée dynamiquement dans l'espace de noms de module

Si je crée une classe dans un module, cette classe a un espace de noms. Cependant, si je crée dynamiquement la classe au sein d'un module, ce n'est pas un espace de noms.

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 

Existe-t-il un moyen d'espace de noms une classe créée dynamiquement?

+0

vous pouvez simplement faire 'const_set', pas besoin de' Object.' –

+0

Eh bien, vous * explicitement * dire à Ruby de définir la constante dans 'Object', qu'attendez-vous? Vous pouvez * explicitement * dire à Ruby de mettre la constante ailleurs * exactement de la même manière *. –

+0

Merci Max! Jorg, tu as raison, mais dans ce cas Max a frappé le clou sur la tête. Je devrais l'avoir mis dans la portée actuelle. –

Répondre

1

Object.const_set définit explicitement la constante dans l'espace de noms Object, qui est l'espace de noms racine. Si vous utilisez const_set sans Object, il définira la constante dans l'espace de nom actuel, qui est MyModule::SubModule dans votre exemple.