有一个带有模块和类名的字符串,比如:

"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并返回该类.由于没有更多组件,该类将从该方法返回(如果有更多组件,它将一直迭代,直到找到最后一个).

Ruby相关问答推荐

在Glade创建的UI中以编程方式填充GtkTreeView

Rbenv说未安装已安装的版本

如何在 Ruby 中反转数字的字节顺序

在Ruby中将嵌套哈希键从CamelCase转换为snake_case

Ruby on Rails:你能把 Ruby 代码放在 YAML 配置文件中吗?

方法如何在 Ruby 中使用哈希参数?

Sublime Text 2 中的 RubyTest

Ruby访问嵌套函数中的外部变量

Scala 的扩展性是否优于其他 JVM 语言?

array.include?多个值

警告! PATH 设置不正确,通常这是由 shell 初始化文件引起的

从 Ruby 中的字符串创建不区分大小写的正则表达式

include_examples和it_behaves_like有什么区别?

Ruby 中的标准文件命名约定

测试变量是否等于两个值之一

带有添加和删除参考的 Rails 迁移

如何在 Ruby 中将类构造函数设为私有?

Ruby中的urldecode?

如何计算 Ruby 数组中的重复元素

Eclipse 的首选 Ruby 插件?