ruby-on-rails plugins ruby-on-rails-3.2 nomethoderror

ruby on rails - Rails 3.2 método indefinido `clave? '' para nada: NilClass



ruby-on-rails plugins (4)

Por algún motivo comencé a tener este error después de cambiar a Rails 3.2. Supongo que tiene algo que ver con el complemento acl9, que traté de reinstalar, pero nada cambió.

Moví los complementos a lib / plugins y agregué el inicializador a config / initializers, pero de nuevo, el mismo error.

Busqué una solución en acl9 repo en Github, pero no pude encontrar nada allí. Tal vez no sea acl9 después de todo.

Tengo paperclip, 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): Me tomó bastante tiempo averiguarlo y todavía no estoy muy seguro de lo que sucedió. Creo que tiene que ver con el soporte de acl9 para Rails 3.1+ Pero al final tomé el código acl9 de github y de repente todo comenzó a funcionar.


Estoy de acuerdo con bmoeskau en que debes verificar el código de tu modelo para detectar errores. Para mi sorpresa, los modelos aparentemente a veces se cargan durante la fase de enrutamiento . Yo descubrí:

  1. El código que causa el problema, en mi caso, está en el modelo, no en el controlador donde lo esperaría.
  2. El undefined method `key?'' for nil:NilClass undefined method `key?'' for nil:NilClass error undefined method `key?'' for nil:NilClass menudo solo ocurre después de la primera vez que accedo a la página.

Por lo que puedo decir, lo que sucede es

  1. Supongamos que tenemos un andamio para Ejemplos, con algún código incorrecto en la app/models/example.rb
  2. Se realiza una solicitud para /examples
  3. La parte de enrutamiento de Rails coincide con app/controllers/examples_controller.rb pero primero carga app/models/example.rb . No sé por qué carga el modelo, pero el efecto es, conjeturo: el error en el modelo detiene una parte del código de enrutamiento, corrompiendo su construcción de un caché de rutas.
  4. En este punto, si tengo suerte, se me informará el error en el navegador. A veces, sin embargo, simplemente recibo un mensaje que dice: No route matches [GET] "/examples" (Para ser justos con Rails, esta complicación adicional parece ser la culpa de no usar resources :examples para hacer la ruta. )
  5. Se realiza una segunda solicitud para /examples
  6. Conjetura: Esta vez, el código de enrutamiento de Rails intenta usar su referencia en caché a la app/controllers/examples_controller.rb pero la caché de rutas está dañada (una variable es nil ) porque el código que establece nunca terminó de ejecutarse.

Este último elemento es muy molesto porque el problema que lo causó (el código incorrecto en el modelo) ni siquiera se está ejecutando.


No estoy seguro si este es el mismo error, pero estaba teniendo un problema similar. En una primera carga de un modelo defectuoso , Rails responde con un error de enrutamiento y luego, para las solicitudes que vienen después, responde con el undefined method ''key?'' for nil:NilClass undefined method ''key?'' for nil:NilClass y el mismo seguimiento de pila.

Esto parece ser un error con el almacenamiento en caché de la clase Rails , pero puede moverse al permitir el almacenamiento en caché o la desactivación de clase en la recarga de la clase de cambio.

config.cache_classes = true

o

config.cache_classes = false config.reload_classes_only_on_change = false


Puede que este no sea tu problema ya que, para empezar, parece que ya tenías código de trabajo, pero para referencia futura para otros, me encontré con el mismo error debido a un error tipográfico dentro de mi código de modelo, así:

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

Tenga en cuenta el "máximo" frente a ": máximo" - esto resultó en el error nulo exacto anterior, y desapareció cuando arreglé ese error tipográfico.


Soy un novato en RoR y recibí el mismo error mientras revisaba la "Guía de inicio" de RoR.

Esto puede sonar tonto, pero otros podrían cometer el mismo error que yo, por lo que publicaré lo que noté en RoR a los ojos de los novatos,

validates :name, : presence => true

Nota ": presencia", debería ser ": presencia". Ahora el carril arroja un error de sintaxis

C:/blog/app/models/post.rb:4: syntax error, unexpected '':'', expecting keyword_end validates :name, : presence => true

Pero si "Refresh" Your browser, oculta el error de sintaxis, en su lugar da

undefined method `key?'' for nil:NilClass

Parece que el caché de Rails es el culpable. :)