2011-09-30 57 views
6

在我的Rails 3.1的应用程序(使用Ruby 1.9),我有一个Deployer1类是在下面的模式目录如何在Ruby/Rails中使用namespaces /子目录动态加载类?

我试图加载工人子目录/动态实例化这个类与此代码:

clazz = item.deployer_class # deployer_class is the class name in a string 
    deployer_class = Object.const_get clazz 
    deployer = deployer_class.new 

如果我不使用名称空间,如全球的东西是这样的:

class Deployer1 
end 

然后它正常工作(deployer_class =“Deployer1”) - 它可以加载类并创建对象。

如果我试图把它变成一个模块的命名空间了一下,像这样:

module Worker 
    class Deployer1 
    end 
end 

它不工作(deployer_class =“工人:: Deployer1”) - 提供有关失踪不变错误,我相信这意味着它找不到课程。

我通常可以访问类在我的Rails代码以静态方式(工人:: Deployer1.new) - 所以Rails的正确配置为加载此,也许我加载了错误的方式...

编辑: 所以,按照弗拉德的答案,我去解决的办法是:

deployer_class.constantize.new 

感谢 克里斯

回答

14

尝试使用constantize代替:

module Wtf 
    class Damm 
    end 
end 
#=> nil 
'Wtf::Damm'.constantize 
#=> Wtf::Damm 
Object.const_get 'Wtf::Damm' 
#=> Wtf::Damm 
+0

谢谢弗拉德 - 正是我需要的。 –

4

Object不知道一个名为Worker::Deployer1的常数,这就是为什么Object.const_get 'Worker::Deployer1'不起作用。 Object只知道一个常数Worker。什么工作是Worker.const_get 'Deployer1'

弗拉德Khomisch的答案的作品,因为如果你看看constantize实施,这正是它的作用:它分裂的'::'和递归const_get的字符串。

+0

很酷 - 谢谢你。我必须深入研究Ruby类和常量:) –