类是必需的,但无法访问

Man*_*rer 5 ruby ruby-on-rails require nameerror

我有一个非常奇怪的错误,我无法解开.

基本上,我在我的lib文件夹中有这个类:

# lib/api/amazon.rb
module API
  class Amazon
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

当我想在某个地方使用它时,我require:

require 'api/amazon'
API::Amazon.do_stuff
Run Code Online (Sandbox Code Playgroud)

这最初是有效的,但过了一段时间它会破坏和提升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
Run Code Online (Sandbox Code Playgroud)

编辑:

我也尝试::API::Amazon.do_stuff过,结果相同.

unc*_*one 1

我编写了一些代码,旨在获得与您相同的结果,也许它可以提供一些线索。

尝试临时.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
Run Code Online (Sandbox Code Playgroud)

它最初运行良好,然后得到相同的错误,“未初始化的常量 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)
Run Code Online (Sandbox Code Playgroud)