Ruby动态嵌套命名空间

时间:2013-07-30 16:21:06

标签: ruby-on-rails-3

给定两个名为

的模型
    SomeModule::V1::Api 
    SomeModule::V2::Api 

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

    api = SomeModule::V1::Api

但是“V1”部分是一个变量,因此我可以在版本之间进行交换。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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