2017-08-18 100 views
1

我正在使用Grape API,並且我有模型具有我用於動態安裝端點的url屬性。我需要能夠對它們進行版本管理,並且在生成它們時,我們無法正確命名它們。在模塊命名空間內創建動態命名的類

如果我在一個模塊中創建一個類,那個類就是名稱空間。

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

但是,如果我動態地在模塊中創建類,它不是命名空間。

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 

是否有一種命名空間動態創建類的方法?

+0

你可以只執行'const_set',不需要'Object.' –

+0

那麼,你*顯式*告訴Ruby在'Object'中設置常量,你期望什麼?你可以明確地告訴Ruby以*完全相同的方式在其他地方設置常量*。 –

+0

謝謝Max!喬治,你是對的,但在這種情況下,馬克斯撞上了頭部。我應該把它放在當前的範圍內。 –

回答

1

Object.const_set在作爲根名稱空間的Object名稱空間中顯式設置常量。如果您使用const_set而不使用Object,它將在當前命名空間中設置常量,在您的示例中爲MyModule::SubModule