2012-07-15 10 views
36

Con Rails 3, después de actualizar de Mongoid 2.x a Mongoid 3.x, mi configuración de Heroku + MongoHQ dejó de funcionar. Lo gracioso es que mis marcos de prueba de desarrollo & y todo mi conjunto de pruebas pasan muy bien.Mongoid 3 + Heroku (MongoHQ) cause Moped :: Errors :: OperationFailure

Sospecho que el problema es con mi archivo mongoid.yml, pero he intentado buscar los documentos, Google & stackoverflow, y utilicé todos los formatos sugeridos, incluyendo esta: heroku mongohq and mongoid Mongo::ConnectionFailure o en realidad esto: https://gist.github.com/2900804

ACTUALIZADO décima sexta julio: Así es como mi archivo mongoid.yml se ve, después de probar varias cosas + después de lo que Jason de MongoHQ sugirió:

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 

(a mi entender, es esencialmente el mismo que el de los enlaces de arriba, excepto que usa el uri; Intenté a la inversa, dividiendo el MONGOHQ_URL en campos separados también, pero no ayudó)

He intentado configurar mongoid como 3.0.0rc y dejando la versión en blanco en mi Gemfile. El uso de la versión de github falló debido a los certificados HTTPS o algo así, así que no me molesté en intentarlo varias veces.

Lo que el controlador de acción dice es esto:

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" 

y cuando corro

heroku run console 

.. me sale esto:

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> 

creo que he buscado en Google todo , revise varios problemas de github mongoid, lea la documentación varias veces ... y me estoy quedando sin ideas aquí.

¿Alguna cosa viene a la mente que debo probar a continuación?

actualización de julio 16to: esto es lo que dice Heroku cuando git principal empuje heroku (Después de hacer lo que Jason de MongoHQ sugirió):

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 

al día 2 de julio de 16to: hizo lo que Jason & MrKurt (primero olvidé ejecutar bundle update mongoid, pero tampoco ayudó). Ahora cambia el error, sin embargo:

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

Trabajo en MongoHQ, si se puede enviar por correo electrónico el apoyo @ mongohq.com podemos brindarle asistencia directa sobre esto. --edit-- Parece que Mongoid no está enviando el nombre de la base de datos + colección correctamente (marque la propiedad "full_collection_name"). ¿Qué versión de Mongoid 3x es esto? El RC anterior tenía algunos problemas con las configuraciones de la base de datos URI. – MrKurt

+0

1) ¿Cómo verifico la propiedad "full_collection_name"? 2) Por alguna razón estaba ejecutando 3.0.0.rc sin saberlo, creía que ya lo había eliminado. Eso no cambió la situación, sin embargo. – herb

+0

Tengo este error, método demasiado indefinido '[] 'para nil: NilClass y no dice de dónde viene TODO –

Respuesta

50

Usted tendrá que utilizar Rubí 1.9.3. Consulte la documentación de Mongoid here y la documentación de Heroku here sobre cómo usar 1.9.3.

También estaba obteniendo errores similares, y cambié mi gemfile para incluir ruby '1.9.3' y todo funcionó como esperaba de nuevo.

Editar: @herb señaló que necesita la última versión del paquete para que esto funcione (gem install bundler --pre). De lo contrario, ruby '1.9.3' en su Gemfile no funcionará.

+4

¡Gracias, esto resolvió el problema! Este post por sí solo lo solucionó: [Soporte de versión Ruby múltiple en Heroku.] (Http://blog.heroku.com/archives/2012/5/9/multiple_ruby_version_support_on_heroku/) Para aquellos que vienen aquí después de mí, asegúrese tener la versión más nueva de bundler (gem install bundler --pre), de lo contrario arrojará un error sobre Gemfile DSL. Gracias de nuevo, este ha sido hasta ahora el problema más frustrante que he tenido con Rails/Mongodb o Heroku. – herb

+1

Funcionó para mí también. Gracias por el consejo "gem install bundler -pre". Intenté agregar "ruby 1.9.3" antes y obtuve errores. Es frustrante lo rápido que la documentación se desactualiza y lo dispersa que está. Gracias a dios por StackOverflow. – CDeutsch

+0

Me alegro de que funcionó. Esto me estaba volviendo loco también.Edité el comentario con información sobre la última versión de bundler requerida, gracias por señalarlo. – rsenk330

2

Trate de añadir un área "opciones" a la sesión por defecto y añadir "skip_version_check: true" como una de las opciones.

Jason MongoHQ

+0

Actualizó la pregunta después de intentar lo que sugirió. No ayudó. error sigue siendo: La operación: # : mensajes,: query => {}} @ campos = nil> se produjo el error "db error de aserción " – herb

+0

Ok, ahora el error ha cambiado, desde la línea de comando tiene este aspecto: Post.first NoMethodError : método indefinido '[] 'para nil: NilClass \t de /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.2/lib/moped/node.rb:74:in' block in command ' \t desde /app/vendor/bundle/ruby/1.9.1/gems/moped-1.1.2/lib/moped/node.rb:522:in '[]' – herb

+2

Tengo el mismo problema. He estado probando cosas por una hora. MongoLab ni MongoHQ parecen funcionar en Heroku. Funcionan bien localmente: NoMethodError (método indefinido '[] 'para nil: NilClass): – CDeutsch

0

Como solución alternativa, el hardcoding del uri de la configuración de heroku parece ser el truco.

ejemplo:

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

supongo que el error fue debido a NilClass <% = ENV [ 'MONGOHQ_URL']%> regresaba nula

Cuestiones relacionadas