3.2 método indefinido tecla`?' para nil:NilClass
-
12-11-2019 - |
Pregunta
Por alguna razón empecé a recibir este mensaje de error después de cambiar a Rails 3.2.Supongo que tiene algo que ver con acl9 plugin, que he intentado volver a instalar, pero nada cambió.
He movido el plugins para lib/plugins y añadidos de inicializador a config/inicializadores pero, de nuevo, el mismo error.
Busqué la solución en acl9 repo en Github, pero no pude encontrar nada allí.Tal vez no es acl9 después de todo.
Tengo un clip, acl9, authlogic instalado.
NoMethodError (undefined method `key?' for nil:NilClass):
actionpack (3.2.1) lib/action_controller/metal/hide_actions.rb:36:in `visible_action?'
actionpack (3.2.1) lib/action_controller/metal/hide_actions.rb:18:in `method_for_action'
actionpack (3.2.1) lib/action_controller/metal/implicit_render.rb:14:in `method_for_action'
actionpack (3.2.1) lib/action_controller/metal/compatibility.rb:61:in `method_for_action'
actionpack (3.2.1) lib/abstract_controller/base.rb:115:in `process'
actionpack (3.2.1) lib/abstract_controller/rendering.rb:45:in `process'
actionpack (3.2.1) lib/action_controller/metal.rb:203:in `dispatch'
actionpack (3.2.1) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
actionpack (3.2.1) lib/action_controller/metal.rb:246:in `block in action'
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:66:in `call'
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:66:in `dispatch'
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:30:in `call'
journey (1.0.3) lib/journey/router.rb:68:in `block in call'
journey (1.0.3) lib/journey/router.rb:56:in `each'
journey (1.0.3) lib/journey/router.rb:56:in `call'
actionpack (3.2.1) lib/action_dispatch/routing/route_set.rb:589:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
rack (1.4.1) lib/rack/etag.rb:23:in `call'
rack (1.4.1) lib/rack/conditionalget.rb:25:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/head.rb:14:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/flash.rb:242:in `call'
rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context'
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/cookies.rb:338:in `call'
activerecord (3.2.1) lib/active_record/query_cache.rb:64:in `call'
activerecord (3.2.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:443:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (3.2.1) lib/active_support/callbacks.rb:405:in `_run__3140920687338355213__call__3168118505970967148__callbacks'
activesupport (3.2.1) lib/active_support/callbacks.rb:405:in `__run_callback'
activesupport (3.2.1) lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
activesupport (3.2.1) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (3.2.1) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/reloader.rb:65:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
railties (3.2.1) lib/rails/rack/logger.rb:26:in `call_app'
railties (3.2.1) lib/rails/rack/logger.rb:16:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/request_id.rb:22:in `call'
rack (1.4.1) lib/rack/methodoverride.rb:21:in `call'
rack (1.4.1) lib/rack/runtime.rb:17:in `call'
activesupport (3.2.1) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.4.1) lib/rack/lock.rb:15:in `call'
actionpack (3.2.1) lib/action_dispatch/middleware/static.rb:53:in `call'
railties (3.2.1) lib/rails/engine.rb:479:in `call'
railties (3.2.1) lib/rails/application.rb:220:in `call'
rack (1.4.1) lib/rack/content_length.rb:14:in `call'
railties (3.2.1) lib/rails/rack/log_tailer.rb:14:in `call'
rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service'
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
/Users/project/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'
EDITAR (SOLUCIONADO):Se tomó un tiempo para averiguar y todavía no estoy muy seguro de lo que pasó.Creo que tiene que ver con acl9 el apoyo de Rails 3.1+, Pero al final me dio la acl9 código desde github y de repente todo comenzó a trabajar.
Solución
Soy un novato para ror y obtuve el mismo error al pasar por ROR "Guía de inicio".
Esto puede sonar tonto, pero otros podrían cometer el mismo error que yo, así que publicé lo que noté en Ror de los ojos de Newbie,
validates :name, : presence => true
Nota ": Presencia", debe ser ": Presencia".Ahora el riel arroja un error de sintaxis
C:/blog/app/models/post.rb:4: syntax error, unexpected ':', expecting keyword_end
validates :name, : presence => true
Pero si "actualiza" su navegador, oculta el error de sintaxis, en su lugar da
undefined method `key?' for nil:NilClass
Parece que los rieles en caché es el culpable.:)
Otros consejos
Esto puede no ser su problema, ya que suena como si ya tenía un código de trabajo para comenzar, pero para una referencia futura para otros, me encontré con el mismo error debido a un simple tipográfico dentro de mi código de modelo, como SO:
class Foo < ActiveRecord::Base
validates :content, :length => { maximum => 10 }
end
que debería haber sido:
class Foo < ActiveRecord::Base
validates :content, :length => { :maximum => 10 }
end
Nota el "máximo" frente a ": máximo": esto resultó en el error exacto de NIL anterior, y se fue cuando fijé ese error.
No estoy seguro de si este es el mismo error, pero estaba teniendo un problema similar.En una primera carga de un modelo de buggy, rieles responde con un error de enrutamiento y luego para las solicitudes que vienen después, responde con undefined method 'key?' for nil:NilClass
y la misma seguimiento de la pila.
Esto parece ser un error con Rails Class Class Caching , pero puede moverse al habilitar el almacenamiento en caché de clase o deshabilitar la recarga de la clase de cambio.
config.cache_classes = true
o
config.cache_classes = false
config.reload_classes_only_on_change = false
Estoy de acuerdo con bmoeskau que usted debe revisar su modelo de código en busca de errores.Para mi sorpresa, modelos, aparentemente, a veces se cargan durante el enrutamiento la fase.He descubierto:
- El código que causa el problema, en mi caso, es en el modelo, no en el controlador de donde me esperan.
- El
undefined method `key?' for nil:NilClass
error a menudo sólo se produce después de la primera vez que accede a la página.
Por lo que puedo contar, lo que pasa es que
- Supongamos que tenemos un andamio para Ejemplos, con algo de mala código en
app/models/example.rb
- Se realiza una solicitud para
/examples
- El enrutamiento de parte de los Carriles de los partidos que a
app/controllers/examples_controller.rb
pero primero cargasapp/models/example.rb
.Yo no sé por qué se carga el modelo, pero el efecto es, me conjetura:El error en el modelo, se detiene en una parte del código de enrutamiento, corrompiendo su construcción de una memoria caché de rutas. - En este punto, si tengo la suerte de que el error será reportado de nuevo a mí en el navegador.A veces, sin embargo, simplemente me sale un mensaje diciendo
No route matches [GET] "/examples"
(Para ser justos para los Rieles, esta complicación añadida parece ser la culpa de la no utilización deresources :examples
para hacer la ruta.El siguiente ocurre independientemente). - Una segunda petición se hace para
/examples
- Conjetura:Esta vez los Rieles del código de enrutamiento intenta utilizar su caché referencia a
app/controllers/examples_controller.rb
pero las rutas cache está dañado (una variable esnil
) porque el código que establece nunca terminado de ejecutarse.
Este último elemento es el más molesto, porque el problema que lo causó (el código de malo en el modelo) no se ejecuta.