2012-03-21 3 views
4

나는 초기화 할 필요가있는 클래스가 있지만 다음과 같이 네임 스페이스 것 :레일 constantize의 인플와 네임 스페이스 클래스를 호출

SomeThing::MyClass.new() 

하지만 갈퀴 작업의 인수에서 호출, 그래서 온다 문자열로 :

rake blah[my_class] 

내 작업 반환 : 그래서 분명 나는이 같은 레이크 작업을 호출하는 경우

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, 아니 레일)의

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>