【发布时间】:2013-12-25 12:44:43
【问题描述】:
我有一个非常奇怪的错误,我无法理解。
基本上,我的lib 文件夹中有这个类:
# lib/api/amazon.rb
module API
class Amazon
...
end
end
当我想在某个地方使用它时,我require它:
require 'api/amazon'
API::Amazon.do_stuff
这最初是有效的,但过了一段时间它会中断并引发NameError: uninitialized constant API::Amazon。当我对此进行调试并在引发错误时再次尝试require该文件时,它返回false,表明该文件已经加载。我也可以在$"(这个加载文件列表)中看到它。为什么我不能访问API::Amazon?
注意:我在ActiveSupport::Inflector 中添加了“API”作为首字母缩写词,这就是我不必使用“Api”的原因:
# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections do |inflect|
inflect.acronym 'API'
end
编辑:
我也试过::API::Amazon.do_stuff,结果一样。
【问题讨论】:
-
看起来
ActiveSupport不时对它的嵌套类进行一些清理,删除动态创建的。如果有人大量使用带有class_eval-like 方法的动态类扩展,则可能需要这样做。 -
不知道你的意思,@mudasobwa。我不使用任何动态
class_eval的东西,它是一个没有任何动态或元编程魔法的常规课程。 -
你确实在已经存在的(和冻结的,根据their politics)模块下定义了一个类;说,你有猴子补丁
ActiveSupport::Inflector。ActiveSupport,一旦加载,可能会对 它的嵌套类执行这样的清理。 -
我在
config/initializers/inflections.rb中以推荐的方式添加了首字母缩写词。我不认为这是问题 -
我猜你混淆了首字母缩写词:推荐的方法是添加首字母缩写词来教
Inflector如何操作。例如,请参阅this post。您在他们的模块下添加了一个类。
标签: ruby-on-rails ruby require nameerror