Подтвердить что ты не робот

Mongoid 3 + Heroku (MongoHQ) вызывает мопед:: Ошибки:: OperationFailure

С Rails 3 после обновления с Mongoid 2.x до Mongoid 3.x моя установка Heroku + MongoHQ перестала работать. Смешно, что мои разработки и тестовые рамки и весь комплект тестов проходят очень хорошо.

Я подозреваю, что проблема связана с моим файлом mongoid.yml, но я попытался выполнить поиск документов, google и stackoverflow и использовал все предложенные форматы, в том числе: heroku mongohq и mongoid Mongo:: ConnectionFailure или на самом деле это: https://gist.github.com/2900804

ОБНОВЛЕНО 16 июля: Вот как выглядит мой файл mongoid.yml, после нескольких попыток + После того, как предложил Джейсон из MongoHQ:

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> 

Я думаю, что я искал все, пропустил несколько проблем github mongoid, прочитал документацию несколько раз... и у меня здесь не хватает идей.

Что-нибудь приходит на ум, я должен попробовать дальше?

ОБНОВЛЕНИЕ 16 июля: это то, что говорит Героку, когда я git нажимаю мастер герою (после того, как предложил Джейсон из MongoHQ):

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 [email protected]:xxxxx.git
   b2d97xy..7b0aczy  master -> master

ОБНОВЛЕНИЕ 2 16 июля: сделал, как сказал Джейсон и г-н Курт (сначала забыл запустить мангоид обновления пакета, но это тоже не помогло). Теперь ошибка изменилась:

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
4b9b3361

Ответ 1

Вам понадобится использовать Ruby 1.9.3. См. Документацию Mongoid здесь и документацию Heroku здесь о том, как использовать 1.9.3.

У меня также были подобные ошибки, и я изменил свой gemfile, включив ruby '1.9.3', и все снова работало как ожидалось.

Изменить: @herb указал, что для этой работы вам понадобится последняя версия bundler (gem install bundler --pre). В противном случае ruby '1.9.3' в вашем Gemfile не будет работать.

Ответ 2

Попробуйте добавить область "параметры" к сеансу по умолчанию и добавьте "skip_version_check: true" в качестве одного из параметров.

Jason MongoHQ

Ответ 3

В качестве обходного пути жесткое кодирование uri из конфигурации heroku, похоже, делает трюк.

Пример:

production:
  sessions:
    default:
      uri: "mongodb://heroku:[email protected]:000/appyyyy"
      options:
        skip_version_check: true
        safe: true

Я предполагаю, что ошибка nilclass была вызвана тем, что <% = ENV ['MONGOHQ_URL']% > возвращал nil