使用Rails constantize inflector调用命名空间类

时间:2012-03-21 07:49:58

标签: ruby-on-rails ruby

我有一个需要初始化的类,但它的命名空间如下:

SomeThing::MyClass.new()

但是我在rake任务中从args中调用它,所以它以字符串形式出现:

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

很明显,如果我像这样调用rake任务:

rake blah[my_class]

我的任务返回:

MyClass # <= Actual ruby object

但是我怎样才能让它在另一个方法之前链接的命名空间内运行,如下所示:

SomeThing::MyClass.new()

从作为输入提供的字符串?

1 个答案:

答案 0 :(得分: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>