0

给定两个命名空间为的模型

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

我想在我的控制器中拨打电话,例如:

    api = SomeModule::V1::Api

但是让“V1”部分成为一个变量,这样我就可以在版本之间进行交换。

关于如何实现这一点的任何想法?

4

2 回答 2

1

如果您不想使用#constantize(这是 ActiveSupport 的一部分),您可以使用 Plain Old Ruby:

version = "V1"
SomeModule.const_get(version).const_get("Api")
# => SomeModule::V1::Api
于 2013-07-30T16:45:01.677 回答
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
于 2013-07-30T16:26:44.353 回答