如何使用Ruby / Rails中的namespaces /子目录动态加载类?

前端之家收集整理的这篇文章主要介绍了如何使用Ruby / Rails中的namespaces /子目录动态加载类?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的Rails 3.1应用程序(使用 Ruby 1.9)中,我有一个Deployer1类,它位于model目录下的worker子目录中

我试图使用以下代码动态加载/实例化此类:

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

如果我不使用命名空间,例如像这样的全局:

  1. class Deployer1
  2. end

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

如果我尝试将它放入一个模块来命名它,如下所示:

  1. module Worker
  2. class Deployer1
  3. end
  4. end

它不起作用(deployer_class =“Worker :: Deployer1”) – 给出一个关于缺少常量的错误,我相信这意味着它找不到类.

我可以通过我的Rails代码以静态方式访问该类(Worker :: Deployer1.new) – 所以Rails配置正确加载它,也许我正在以错误的方式加载它…

编辑:
所以,根据弗拉德的回答,我采用的解决方案是:

  1. deployer_class.constantize.new

谢谢
克里斯

解决方法

尝试使用 constantize代替:
  1. module Wtf
  2. class Damm
  3. end
  4. end
  5. #=> nil
  6. 'Wtf::Damm'.constantize
  7. #=> Wtf::Damm
  8. Object.const_get 'Wtf::Damm'
  9. #=> Wtf::Damm

猜你在找的Ruby相关文章