类是必需的,但无法访问

时间:2013-12-08 12:01:43

标签: ruby-on-rails ruby require nameerror

我有一个非常奇怪的错误,我无法解决这个问题。

基本上,我在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,结果相同。

2 个答案:

答案 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}}

现在似乎工作正常。