为什么Module.const_get在作用域类的情况下抛出NameError异常?

时间:2014-05-23 13:39:54

标签: ruby

我在Rails应用程序设置中有以下模型:

# app/models/event_list/peak.rb
class EventList::Peak < AR
  # ...
end

在我用于导入的gem(activerecord-import)中,以下行触发NameError异常:

Module.const_get(class_name)
# class_name evals to :'EventList::Peak'

所以,我启动了Rails控制台并尝试通过以下方式手动获取我需要的正确符号:

Module.const_get(EventList::Peak.to_s.to_sym)

但是我得到了同样的错误。当我在控制台中输入EventList::Peak时,我得到了正确的类对象。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

Module::const_get不支持任意深度;它只接收调用模块的子节点。因此,在您的情况下,EventList.const_get(Peak.to_s.to_sym)应该有效。

您可以使用ActiveSupport&#39; qualified_const_get来做您要求的事情,例如:

require 'active_support/core_ext'
Module.qualified_const_get(EventList::Peak.to_s.to_sym)

如果您不想使用ActiveSupport,您也可以这样做:

Module.const_get(EventList.to_s.to_sym).const_get(Peak.to_s.to_sym). 

使用inject创建包装器以支持任意深度并复制qualified_const_get功能也很容易。