具有包含模块和类名的字符串,如下所示:
"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 >
发布于 2010-07-02 14:38:43
如果你想要一些简单的东西来处理你的特殊情况,你可以这样写
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
,并返回该类。由于没有更多的组件,该类将从方法中返回(如果有更多的组件,它将进行迭代,直到找到最后一个组件)。
发布于 2010-07-02 15:18:51
ActiveSupport提供了一个名为constantize的方法,它可以做到这一点。如果您在Rails上,我假设您是基于常量的名称,那么您已经加载了ActiveSupport。
require 'active_support/core_ext/string'
class Admin
class MetaDatasController
end
end
"Admin::MetaDatasController".constantize # => Admin::MetaDatasController
要查看该方法是如何实现的,请查看https://github.com/rails/rails/blob/85c2141fe3d7edb636a0b5e1d203f05c70db39dc/activesupport/lib/active_support/inflector/methods.rb#L230-L253
发布于 2014-06-26 08:29:35
在Ruby 2.x中,你可以这样做:
Object.const_get('Admin::MetaDatasController')
=> Admin::MetaDatasController
https://stackoverflow.com/questions/3163641
复制相似问题