Ruby 为什么Module.const_get在作用域类的情况下抛出NameError异常?
我在Rails应用程序中设置了以下模型:Ruby 为什么Module.const_get在作用域类的情况下抛出NameError异常?,ruby,Ruby,我在Rails应用程序中设置了以下模型: # app/models/event_list/peak.rb class EventList::Peak < AR # ... end 因此,我启动Rails控制台并尝试通过以下操作手动获取所需的正确符号: Module.const_get(EventList::Peak.to_s.to_sym) 但我也犯了同样的错误。当我在控制台中简单地键入EventList::Peak时,我得到了正确的类对象 我在这里遗漏了什么吗?模块::const
# app/models/event_list/peak.rb
class EventList::Peak < AR
# ...
end
因此,我启动Rails控制台并尝试通过以下操作手动获取所需的正确符号:
Module.const_get(EventList::Peak.to_s.to_sym)
但我也犯了同样的错误。当我在控制台中简单地键入EventList::Peak
时,我得到了正确的类对象
我在这里遗漏了什么吗?
模块::const\u get
不支持任意深度;它只获取调用模块的子级。因此,在您的情况下,EventList.const\u get(Peak.to\u s.to\u sym)
应该可以工作
您可以使用ActiveSupport
的qualified\u const\u 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\u const\u get
功能,也可以很容易地创建一个包装器。太好了,谢谢!尽管我需要提到,qualified\u const\u get
似乎只处理字符串,而不是符号。
Module.const_get(EventList.to_s.to_sym).const_get(Peak.to_s.to_sym).