给定两个命名空间为的模型
SomeModule::V1::Api
SomeModule::V2::Api
我想在我的控制器中拨打电话,例如:
api = SomeModule::V1::Api
但是让“V1”部分成为一个变量,这样我就可以在版本之间进行交换。
关于如何实现这一点的任何想法?
给定两个命名空间为的模型
SomeModule::V1::Api
SomeModule::V2::Api
我想在我的控制器中拨打电话,例如:
api = SomeModule::V1::Api
但是让“V1”部分成为一个变量,这样我就可以在版本之间进行交换。
关于如何实现这一点的任何想法?
如果您不想使用#constantize
(这是 ActiveSupport 的一部分),您可以使用 Plain Old Ruby:
version = "V1"
SomeModule.const_get(version).const_get("Api")
# => SomeModule::V1::Api
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