Chr*_*ton 7 ruby ruby-on-rails-3
在我的Rails 3.1应用程序(使用Ruby 1.9)中,我有一个Deployer1类,位于model目录下的worker子目录中
我试图使用以下代码动态加载/实例化此类:
clazz = item.deployer_class # deployer_class is the class name in a string
deployer_class = Object.const_get clazz
deployer = deployer_class.new
Run Code Online (Sandbox Code Playgroud)
如果我不使用名称空间,例如像这样的全局:
class Deployer1
end
Run Code Online (Sandbox Code Playgroud)
然后它工作正常(deployer_class ="Deployer1") - 它可以加载类并创建对象.
如果我尝试将它放入一个模块来命名它,如下所示:
module Worker
class Deployer1
end
end
Run Code Online (Sandbox Code Playgroud)
它不起作用(deployer_class ="Worker :: Deployer1") - 给出一个关于缺少常量的错误,我相信这意味着它找不到类.
我可以通过我的Rails代码以静态方式访问该类(Worker :: Deployer1.new) - 所以Rails配置正确加载它,也许我正在以错误的方式加载它...
编辑:那么,根据弗拉德的回答,我采用的解决方案是:
deployer_class.constantize.new
Run Code Online (Sandbox Code Playgroud)
谢谢克里斯
Vla*_*ich 16
尝试使用constantize:
module Wtf
class Damm
end
end
#=> nil
'Wtf::Damm'.constantize
#=> Wtf::Damm
Object.const_get 'Wtf::Damm'
#=> Wtf::Damm
Run Code Online (Sandbox Code Playgroud)
Object不知道一个常数命名Worker::Deployer1,这就是为什么Object.const_get 'Worker::Deployer1'不起作用.Object只知道一个常数Worker.工作是什么Worker.const_get 'Deployer1'.
Vlad Khomisch的答案是有效的,因为如果你看一下它的实现constantize,这正是它的作用:它将字符串拆分'::'并递归const_get.
| 归档时间: |
|
| 查看次数: |
4940 次 |
| 最近记录: |