怎么在Ruby中得到一个类的名字?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

具有模块和类名称的字符串,如:

"Admin::MetaDatasController"

我如何获得实际的类?

如果没有模块,以下代码可以工作:

Kernel.const_get("MetaDatasController")

但它与模块断开:

ruby-1.8.7-p174 > Kernel.const_get("Admin::MetaDatasController")
NameError: wrong constant name Admin::MetaDatasController
        from (irb):34:in `const_get'
        from (irb):34
ruby-1.8.7-p174 > 
提问于
用户回答回答于

如果想要简单的东西来处理你的情况,可以

Object.const_get("Admin").const_get("MetaDatasController")

但是如果想要更通用的东西,请将字符串拆分::并依次解析名称:

def class_from_string(str)
  str.split('::').inject(Object) do |mod, class_name|
    mod.const_get(class_name)
  end
end

the_class = class_from_string("Admin::MetaDatasController")

在第一次迭代Object中要求常量Admin并返回Admin模块或类,然后在第二次迭代中向模块或类请求常量MetaDatasController,并返回该类。由于没有更多的组件从该方法返回类(如果有更多的组件,它会迭代直到找到最后的组件)。

用户回答回答于

ActiveSupport提供了一个名为constantize的方法,它将执行此操作。如果你在Rails上,我假设你基于常量的名称,那么你已经加载了ActiveSupport。

require 'active_support/core_ext/string'

class Admin
  class MetaDatasController
  end
end

"Admin::MetaDatasController".constantize # => Admin::MetaDatasController

扫码关注云+社区