2012-03-21 27 views
4

我有需要初始化一個類,但它的命名空間是這樣的:調用使用Rails constantize偏轉一個命名空間類

SomeThing::MyClass.new() 

但我從一耙的任務ARGS調用它,所以它涉及作爲一個字符串:

task :blah, [:my_class_name] => :environment do |t, args| 
    class_name = args[:my_class_name].camelize.constantize 
    puts class_name 
end 

所以,很顯然,如果我叫耙任務是這樣的:

rake blah[my_class] 

我的任務回報:

MyClass # <= Actual ruby object 

但是我怎樣才能得到它從之前的另一種方法鏈接命名空間中運行,就像這樣:

SomeThing::MyClass.new() 

從作爲輸入提供的字符串?

回答

8

您可以通過只使用類名的字符串,並做

Something.const_get(args[:my_class_name]).new 

下面是一個簡化版本(IRB正常,沒有Rails)的讓您的生活更輕鬆:

module Something ; end 
class Something::MyClass ; end 
my_class_name = "MyClass" 
Something.const_get(my_class_name).new 
#=> #<Something::MyClass:0x007fa8c4122dd8> 
相關問題