2013-07-30 62 views
0

給定兩個模型紅寶石動態嵌套命名空間

SomeModule::V1::Api 
    SomeModule::V2::Api 

我想打個電話在我的控制器一樣,被命名空間:

api = SomeModule::V1::Api 

,但有「V1」部分是一個變量,這樣我可以在不同版本之間進行切換

關於如何做到這一點的任何想法?

回答

1
v = 'V1' 
"SomeModule::#{v}::Api".constantize 
=> SomeModule::V1::Api 

例子:

module SomeModule 
    module V1; end 
    module V2; end 
end 

class SomeModule::V1::Api 
    def self.foo; 'V1 foo'; end 
end 

class SomeModule::V2::Api 
    def self.foo; 'V2 foo'; end 
end 

v = 'V1' 
puts "SomeModule::#{v}::Api".constantize.foo 
=> V1 foo 
v = 'V2' 
puts "SomeModule::#{v}::Api".constantize.foo 
=> V2 foo 
+0

真棒。因爲我在Rails中工作並擁有ActiveSupport,所以選擇這一個。謝謝! – samchoi

1

如果你不想使用#constantize(是的ActiveSupport的一部分),你可以用普通老式紅寶石做到這一點:

version = "V1" 
SomeModule.const_get(version).const_get("Api") 
# => SomeModule::V1::Api 
+0

+1,雖然問題被標記爲RoR,所以我認爲「ActiveSupport」是可以接受的。 –

+0

是的,我個人更喜歡'#constantize',但是我不得不在Rails環境之外做幾次,所以我想我會提供這個選項。 :) –

+0

這個答案也是不錯的。在Rails之外絕對有用。將保持在我的背囊。 – samchoi