2012-03-21 10 views
4

私は初期化する必要がクラスを持っていますが、それは次のように名前空間です:はRailsのconstantizeのインフレクタと名前空間、クラスを呼び出す

SomeThing::MyClass.new() 

しかし、私はrakeタスクで引数からそれを呼んでいるので、それは来ます文字列として:

rake blah[my_class] 

マイタスクが戻る:だから明らかに私はこのようなrakeタスクを呼び出す場合

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

MyClass # <= Actual ruby object 

しかし、私はこのように、それは別の方法の前に連鎖した名前空間内から実行する方法を得ることができます入力として提供文字列から

SomeThing::MyClass.new() 

答えて

8

あなたはここでは簡易版(通常IRB、無Railsの)ちょうどクラス名の文字列を使用して

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

をすることによってあなたの人生を容易にすることができます。

module Something ; end 
class Something::MyClass ; end 
my_class_name = "MyClass" 
Something.const_get(my_class_name).new 
#=> #<Something::MyClass:0x007fa8c4122dd8> 
は、
関連する問題