我有一个非常奇怪的错误,我无法解决这个问题。
基本上,我在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
?
注意:我添加了“API”作为ActiveSupport::Inflector
的首字母缩写词,这就是为什么我不必使用“Api”:
# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections do |inflect|
inflect.acronym 'API'
end
编辑:
我也尝试了::API::Amazon.do_stuff
,结果相同。
答案 0 :(得分:1)
我写了一些代码,旨在获得与你相同的结果,也许它可以提供一些线索。
trytemp.rb:
module API
class Amazon
def hello
puts "API::Amazon initially works well"
$stdout.flush
end
end
end
s = API::Amazon.new
s.hello
p API.constants
API = Module.new
p API.constants # Here you can see constant Amazon disappers from module API
s = API::Amazon.new
s.hello
它最初运行良好,然后得到相同的错误,“未初始化的常量API :: Amazon(NameError)”:
$ ruby trytemp.rb
API::Amazon initially works well
[:Amazon]
trytemp.rb:15: warning: already initialized constant API
[]
trytemp.rb:19:in `<main>': uninitialized constant API::Amazon (NameError)
答案 1 :(得分:0)
编辑:
我虽然找到了答案,但又发生了同样的错误...... :(
结束编辑
在@uncutstone的帮助下,我似乎找到了答案。
事实证明,我不仅使用了API
API::Amazon
命名空间,而且还使用了某些控制器,如下所示:
# app/controllers/api/v1/accounts_controller.rb
class API::V1::AccountsController < APIController
...
end
我的理论是,其中一个控制器在某个时间点自动重新加载,并重新初始化(并因此清除)API
模块/命名空间。
因此API::Amazon
之后无法使用require
,但重新lib/api/amazon.rb
# app/controllers/api/v1/accounts_controller.rb
module API
class V1::AccountsController < APIController
...
end
end
没有帮助,因为它已经被要求,因此没有再次加载。
我将控制器更改为如下所示:
{{1}}
现在似乎工作正常。