2013-07-30 3 views
0

Учитывая две модели, которые пространство имен, какрубин Dynamic Уплотненного Пространство имена

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

Я хочу, чтобы позвонить в моем контроллере, как:

api = SomeModule::V1::Api 

но есть часть «V1» быть переменной, так что я могу поменять местами между версиями.

Любые идеи о том, как это сделать?

ответ

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 
+0

удивительный , выбрав один из них ниже, потому что я работаю в Rails и имею ActiveSupport. благодаря! – samchoi

1

Если вы не хотите использовать #constantize (который является частью ActiveSupport), вы можете сделать это с Plain Old Ruby:

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

+1, хотя вопрос был помечен как RoR, поэтому я предположил, что 'ActiveSupport' будет приемлемым. –

+0

Да, я предпочитаю '# constantize' лично, но мне приходилось делать это несколько раз за пределами контекста Rails, поэтому я решил, что предлагаю вариант. :) –

+0

Этот ответ тоже хорош. Определенно полезно вне Rails. Будет держать в моем backpocket. – samchoi

Смежные вопросы