如何修复'NameError:未初始化的常量Mongo :: ConnectionFailure

时间:2019-01-29 20:00:36

标签: ruby mongodb sinatra mongoid unicorn

更新2: 我能够进一步缩小范围,以至于当我运行耙子时,它显然没有加载Mongo类的 all 。我在puts Mongo.constants之后在config / boot.rb中添加了require 'mongo'。当我运行该应用程序时,它会输出一个长列表,其中包括Connection和ConnectionFailure类。当我尝试运行耙时,它输出的列表要短得多,并且缺少这两个类。这是怎么回事?

更新: 通过挽救通用异常,我消除了Mongo :: ConnectionFailure的NameError,现在它为Mongo :: Connection抛出了NameError。所以我想这是一个mongo加载问题。

当我执行puts defined? Mongo时,当我运行应用程序和运行rake时,它会打印constant。但是,puts defined? Mongo::Connection会在我运行应用程序时显示constant,但在运行rake时会显示空白行。

无论我是从config / boot.rb还是从app.rb要求mongo,错误均相同。


我是红宝石的新手,并试图与Sinatra,Unicorn和Mongo / mongoid一起建立一个应用程序。我正在尝试执行rake任务,而当我运行rake import:areas时,出现以下错误:

rake aborted!
NameError: uninitialized constant Mongo::ConnectionFailure
/home/amanda/Documents/development/app-name/app.rb:7:in `rescue in block in <class:App>'

mongo服务器正在运行,并且代码通过了早期的Mongo :: Connection调用(如果未加载mongo,我希望在该调用中抛出NameError)而没有错误。看着mongod控制台,它似乎甚至没有击中mongo,因为控制台日志中没有任何连接尝试的指示。

当我运行应用程序本身(使用heroku localbundle exec unicorn -p $PORT -c "/path/to/unicorn.rb")时,它会启动并在适当的端口上侦听,并且我可以毫无问题地访问根端点。看着mongod控制台启动时,我可以看到它已成功连接到数据库。我正在运行mongo gem 1.10.2和mongoid 3.1.6(对我正在使用的代码库的要求)。

rakefile的相关行:

require "./config/boot"

namespace "import" do
    task "areas" do
        # code here
    end
end

config / boot.rb:

require 'sinatra'
require 'mongo'
require 'mongoid'
require './app'

mongoid.yml:

development:
  clients:
    default:
      database: db-name
      hosts:
        - localhost:27017
      options:
  options:

app.rb:

class App < Sinatra::Base
  configure do
    # mongo
    begin
      mongo_db = Mongo::Connection.new.db "db-name"
      set :mongo_db, mongo_db
    rescue Mongo::ConnectionFailure
      set :mongo_db, {}
    end
  end
  # more code here
end

我在这里想念什么?我搜索过的东西似乎都没有这个问题。我希望此错误抛出在Mongo::Connection而不是Mongo::ConnectionFailure行。

1 个答案:

答案 0 :(得分:0)

事实证明Gemfile.lock某种程度上已损坏,并且rake正在使用比heroku local更新的mongo版本。 :-/