Ruby on rails 3 Ruby动态嵌套命名空间

Ruby on rails 3 Ruby动态嵌套命名空间,ruby-on-rails-3,Ruby On Rails 3,给定两个名称空间为的模型 SomeModule::V1::Api SomeModule::V2::Api 我想在我的控制器中拨打电话,如: api = SomeModule::V1::Api 但是让“V1”部分成为一个变量,这样我就可以在不同版本之间交换 关于如何实现这一点有什么想法吗 v = 'V1' "SomeModule::#{v}::Api".constantize => SomeModule::V1::Api 例如: module SomeMod

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

    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的一部分),可以使用普通的旧Ruby:

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

+1,虽然这个问题被标记为RoR,所以我认为
ActiveSupport
是可以接受的。是的,我个人更喜欢
#constantize
,但我不得不在Rails上下文之外做过几次,所以我想我会提供这个选项。:)这个答案也很好。在Rails之外绝对有用。会放在我的后口袋里。太棒了。选择这一个而不是下面的一个,因为我在Rails中工作并且拥有ActiveSupport。谢谢