給定兩個模型紅寶石動態嵌套命名空間
SomeModule::V1::Api
SomeModule::V2::Api
我想打個電話在我的控制器一樣,被命名空間:
api = SomeModule::V1::Api
,但有「V1」部分是一個變量,這樣我可以在不同版本之間進行切換
關於如何做到這一點的任何想法?
給定兩個模型紅寶石動態嵌套命名空間
SomeModule::V1::Api
SomeModule::V2::Api
我想打個電話在我的控制器一樣,被命名空間:
api = SomeModule::V1::Api
,但有「V1」部分是一個變量,這樣我可以在不同版本之間進行切換
關於如何做到這一點的任何想法?
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
如果你不想使用#constantize
(是的ActiveSupport的一部分),你可以用普通老式紅寶石做到這一點:
version = "V1"
SomeModule.const_get(version).const_get("Api")
# => SomeModule::V1::Api
+1,雖然問題被標記爲RoR,所以我認爲「ActiveSupport」是可以接受的。 –
是的,我個人更喜歡'#constantize',但是我不得不在Rails環境之外做幾次,所以我想我會提供這個選項。 :) –
這個答案也是不錯的。在Rails之外絕對有用。將保持在我的背囊。 – samchoi
真棒。因爲我在Rails中工作並擁有ActiveSupport,所以選擇這一個。謝謝! – samchoi