Mongoid 3 + Heroku(MongoHQ)导致Moped :: Errors :: OperationFailure
使用Rails 3,从Mongoid 2.x升级到Mongoid 3.x后,我的Heroku + MongoHQ设置停止工作。 有趣的是,我的开发和testing框架,以及我的整个testing套件都很好。
我怀疑问题是与我的mongoid.yml文件,但我已经尝试search文档,谷歌和stackoverflow,并使用所有build议的格式,包括: heroku mongohq和mongoid Mongo :: ConnectionFailure或实际上这个: https:/ /gist.github.com/2900804
更新7月16日:这是我的mongoid.yml文件看起来,尝试了多个东西后+ 从MongoHQ的Jasonbuild议 :
development: sessions: default: database: development hosts: - localhost:27017 test: sessions: default: database: test hosts: - localhost:27017 production: sessions: default: uri: <%= ENV['MONGOHQ_URL'] %> options: skip_version_check: true safe: true
(据我的理解,它基本上和上面的链接一样,只是它使用了uri;我尝试了另一种方式,把MONGOHQ_URL分成了单独的字段,但是没有帮助)
我试着将mongoid设置为3.0.0rc,并将版本留在我的Gemfile中。 使用github版本由于HTTPS证书或其他原因而失败,所以我没有多次尝试它。
动作控制器说的是这样的:
Moped::Errors::OperationFailure in Home#index Showing /app/app/views/home/index.html.haml where line #2 raised: The operation: #<Moped::Protocol::Command @length=68 @request_id=4 @response_to=0 @op_code=2004 @flags=[:slave_ok] @full_collection_name=".$cmd" @skip=0 @limit=-1 @selector={:count=>:posts, :query=>{}} @fields=nil> failed with error "db assertion failure"
当我跑步
heroku run console
..我得到这个:
irb(main):052:0> Location.create! NoMethodError: undefined method `[]' for nil:NilClass from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:74:in `block in command' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:522:in `[]' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:522:in `block (3 levels) in flush' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:521:in `map' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:521:in `block (2 levels) in flush' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:113:in `ensure_connected' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:517:in `block in flush' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:532:in `logging' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:516:in `flush' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:505:in `process' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:70:in `command' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/node.rb:356:in `refresh' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/cluster.rb:101:in `block in refresh' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/cluster.rb:114:in `each' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/cluster.rb:114:in `refresh' from /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.1/lib/moped/cluster.rb:67:in `nodes' ... 15 levels... from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:405:in `__run_callback' from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:385:in `_run_save_callbacks' from /app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/callbacks.rb:81:in `run_callbacks' from /app/vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.1/lib/mongoid/callbacks.rb:98:in `run_callbacks' from /app/vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.1/lib/mongoid/persistence/insertion.rb:23:in `prepare' from /app/vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.1/lib/mongoid/persistence/operations/insert.rb:26:in `persist' from /app/vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.1/lib/mongoid/persistence.rb:50:in `insert' from /app/vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.1/lib/mongoid/persistence.rb:251:in `block in create!' from /app/vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.1/lib/mongoid/threaded/lifecycle.rb:173:in `_creating' from /app/vendor/bundle/ruby/1.9.1/gems/mongoid-3.0.1/lib/mongoid/persistence.rb:249:in `create!' from (irb):52 from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands/console.rb:47:in `start' from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands/console.rb:8:in `start' from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands.rb:41:in `<top (required)>' from script/rails:6:in `require' from script/rails:6:in `<main>'irb(main):053:0>
我想我已经search了一切,运行了多个github mongoid的问题,多次阅读文档…我在这里用尽了想法。
有什么想到我应该尝试下一个?
更新7月16日:这是Heroku当我推grato heroku大师时所说的(在做了MongoHQ的Jasonbuild议之后):
git push heroku master Counting objects: 7, done. Delta compression using up to 16 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 372 bytes, done. Total 4 (delta 3), reused 0 (delta 0) -----> Heroku receiving push -----> Ruby/Rails app detected -----> Installing dependencies using Bundler version 1.2.0.pre Running: bundle install --without development:test --path vendor/bundle --binstubs bin/ --deployment Using rake (0.9.2.2) Using i18n (0.6.0) Using multi_json (1.3.6) Using activesupport (3.2.6) Using builder (3.0.0) # ... shortened this # Using libv8 (3.3.10.4) Using moped (1.1.2) Using origin (1.0.4) Using mongoid (3.0.0.rc) Using omniauth (1.1.0) Using quimby (0.4.5) Using bundler (1.2.0.pre) Using rails (3.2.6) Using therubyracer (0.10.1) Using thin (1.3.1) Your bundle is complete! It was installed into ./vendor/bundle Cleaning up the bundler cache. -----> Writing config/database.yml to read from DATABASE_URL -----> Preparing app for Rails asset pipeline Running: rake assets:precompile Asset precompilation completed (31.24s) -----> Rails plugin injection Injecting rails_log_stdout Injecting rails3_serve_static_assets -----> Discovering process types Procfile declares types -> (none) Default types for Ruby/Rails -> console, rake, web, worker -----> Compiled slug size is 18.7MB -----> Launching... done, v92 http://xxxxx.herokuapp.com deployed to Heroku To git@heroku.com:xxxxx.git b2d97xy..7b0aczy master -> master
7月16日更新:就像Jason&MrKurt所说的那样(首先忘记运行bundle更新mongoid,但是也没有帮助)。 现在错误改变了,但是:
NoMethodError in Home#index Showing /app/app/views/home/index.html.haml where line #2 raised: undefined method `[]' for nil:NilClass Extracted source (around line #2): 1: %h1 Most recent posts 2: - if @posts.length > 0
你将需要使用Ruby 1.9.3。 在这里查看Mongoid文档和Heroku文档,了解如何使用1.9.3。
我也得到类似的错误,我改变了我的gemfile包括ruby '1.9.3'
和一切工作再次预期。
编辑:@herb指出,你需要最新版本的gem install bundler --pre
( gem install bundler --pre
)。 否则,Gemfile中的ruby'1.9.3 ruby '1.9.3'
将不起作用。
尝试将“选项”区域添加到默认会话,并添加“skip_version_check:true”作为其中一个选项。
Jason MongoHQ
作为一种解决方法,从herokuconfiguration文件对uri进行硬编码似乎有诀窍。
例如:
production: sessions: default: uri: "mongodb://heroku:xxxx@domain.mongohq.com:000/appyyyy" options: skip_version_check: true safe: true
我猜nilclass错误是因为<%= ENV ['MONGOHQ_URL']%>返回零