2012-07-15 14 views
36

Con Rails 3, dopo l'aggiornamento da Mongoid 2.x a Mongoid 3.x, il mio setup di Heroku + MongoHQ ha smesso di funzionare. La cosa divertente è che il mio framework di sviluppo & e tutta la mia suite di test passano bene.Mongoid 3 + Heroku (MongoHQ) causa Ciclomotore :: Errori :: OperationFailure

Ho il sospetto che il problema è con il mio file mongoid.yml, ma ho provato a cercare i Documenti, Google & StackOverflow, ed ho usato tutti i formati proposti, tra cui questo: heroku mongohq and mongoid Mongo::ConnectionFailure o in realtà questo: https://gist.github.com/2900804

AGGIORNAMENTO 16 luglio: Questo è come il mio file mongoid.yml sembra, dopo aver provato diverse cose + dopo quello che Jason da MongoHQ suggerito:

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 

(la mia comprensione, è essenzialmente uguale a quello nei link sopra, eccetto che usa l'uri; Ho provato l'altro modo, suddividendo il MONGOHQ_URL anche nei campi separati, ma non è stato d'aiuto)

Ho provato a impostare mongoid come 3.0.0rc e lasciare la versione vuota nel mio Gemfile. L'uso della versione github non è riuscito a causa dei certificati HTTPS o qualcosa del genere, quindi non mi sono preoccupato di provarlo più volte.

Che il controller azione dice è questo:

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" 

e quando corro

heroku run console 

.. Ho ottenere questo:

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> 

Penso Googled tutto , corro attraverso più problemi mongoid github, leggi la documentazione più volte ... e sto esaurendo le idee qui.

Qualcosa mi viene in mente Dovrei provare dopo?

AGGIORNAMENTO 16 luglio: questo è quello che dice Heroku quando ho git padrone spinta Heroku (Dopo aver fatto ciò che Jason da MongoHQ suggerito):

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 

UPDATE 2 16 luglio: fece come Jason & MrKurt (prima ho dimenticato di eseguire il bundle update mongoid, ma non è stato di alcun aiuto). Ora l'errore è cambiato, però:

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 
+0

Io lavoro in MongoHQ, se potete email support @ mongohq.com possiamo darti un supporto diretto su questo. --edit-- Sembra che Mongoid non stia inviando correttamente il nome del database + raccolta (controllare la proprietà "full_collection_name"). Quale versione di Mongoid 3x è questa? Il precedente RC aveva alcuni problemi con le configurazioni del database URI. – MrKurt

+0

1) Come posso controllare la proprietà "full_collection_name"? 2) Per qualche motivo stavo eseguendo 3.0.0.rc senza sapere - pensavo di averlo rimosso. Questo non ha cambiato la situazione, però. – herb

+0

Ho questo errore, anche il metodo non definito '[] 'per nil: NilClass e non dice da dove viene AT ALL –

risposta

50

Sarà necessario utilizzare Rubino 1.9.3. Vedi documentazione Mongoide here e documentazione di Heroku here su come usare 1.9.3.

Avevo anche errori simili e ho modificato il mio gemfile per includere ruby '1.9.3' e tutto ha funzionato come previsto.

Modifica: @herb ha sottolineato che è necessario l'ultima versione di bundler affinché funzioni (gem install bundler --pre). Altrimenti, ruby '1.9.3' nel tuo Gemfile non funzionerà.

+4

Grazie, questo ha risolto il problema! Questo post lo ha risolto: [Supporto per più versioni in Ruby su Heroku.] (Http://blog.heroku.com/archives/2012/5/9/multiple_ruby_version_support_on_heroku/) Per coloro che vengono qui dopo di me, assicurati per avere la versione più recente di bundler (gem install bundler --pre), altrimenti genererà un errore sul Gemfile DSL. Grazie ancora - questo è stato finora il problema più frustrante che ho avuto con Rails/Mongodb o Heroku! – herb

+1

Ha funzionato anche per me. Grazie per il suggerimento "gem install bundler -pre". Avevo provato ad aggiungere "Ruby 1.9.3" prima e ho avuto degli errori. È frustrante quanto rapida sia la documentazione obsoleta e quanto dispersa. Grazie a Dio per StackOverflow. – CDeutsch

+0

Felice che abbia funzionato. Anche questo mi stava facendo impazzire.Ho modificato il commento con le informazioni sull'ultima versione di bundler richiesta, grazie per averlo indicato. – rsenk330

2

Prova ad aggiungere una zona "opzioni" per la sessione di default e aggiungere "skip_version_check: true", come una delle opzioni.

Jason MongoHQ

+0

Aggiornato la domanda dopo aver provato ciò che hai suggerito. Non ha aiutato errore è ancora: L'operazione: # : i messaggi,: query => {}} @ campi = nil> non riuscita con errore "db asserzione fallita " – herb

+0

Ok, quindi ora l'errore è cambiato, dalla riga di comando appare così: Post.first NoMethodError : metodo non definito '[] 'per nil: NilClass \t da /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.2/lib/moped/node.rb:74:in' block in command ' \t da /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.2/lib/moped/node.rb:522:in '[]' – herb

+2

Ho lo stesso problema. Ho provato cose per un'ora. MongoLab e MongoHQ sembrano funzionare su Heroku. Funzionano bene localmente: NoMethodError (metodo non definito '[] 'per nil: NilClass): – CDeutsch

0

Come soluzione temporanea, l'uri della configurazione di heroku è codificato in modo fisso.

es:

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

sto cercando di indovinare l'errore è stato nilclass perché <% = ENV [ 'MONGOHQ_URL']%> stava tornando nil

Problemi correlati