2012-02-25 12 views
22

Por alguna razón empecé 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ó.Rails 3.2 método indefinido `clave? ' para nil: NilClass

Moví los complementos a lib/plugins y agregué el inicializador a config/initializers pero nuevamente, 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 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 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.

Respuesta

16

soy un novato en RoR y obtuve el mismo error al pasar por RoR "Guía de introducción".

Esto puede sonar tonto, pero otros podrían hacer el mismo error que yo, así que publicar lo que he notado en RoR de los ojos de novato,

validates :name, : presence => true 

Nota ": presencia", debe ser ": presencia ". Ahora el carril genera un error de sintaxis

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

Pero si "refrescar" Tu navegador, se esconde el error de sintaxis, en vez da

undefined method `key?' for nil:NilClass 

Parece rieles almacenamiento en caché es el culpable. :)

+0

Sí, eso es realmente el caso ... así es como me encontré con este problema al menos. Aceptaré la respuesta hasta que alguien pueda darme una idea más profunda. – Stpn

+0

Hago rieles profesionalmente y todavía no es lo mismo validar. – Chris

+0

para referencia futura - tuve el mismo problema debido a un error tipográfico: escribí validar en lugar de validar – nurinur

9

Puede que este no sea su problema, ya que para empezar, ya tenía código de trabajo, pero para futuras referencias, me encontré con el mismo error debido a un error tipográfico dentro del código de mi modelo, como el siguiente:

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 la "máxima" frente a ": máxima" - esto dio como resultado el error exacto nula anterior, y se fue cuando me fijo que error tipográfico.

6

Estoy de acuerdo con bmoeskau en que debe verificar el código de su modelo para detectar errores. Para mi sorpresa, los modelos aparentemente a veces se cargan durante la fase de enrutamiento. 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 error undefined method `key?' for nil:NilClass a menudo solo ocurre después de la primera vez que accedo a la página.

Por lo que yo puedo decir, lo que sucede es

  1. Supongamos que tenemos un andamio para los ejemplos, con un poco de mal código en app/models/example.rb
  2. Se realiza una solicitud para /examples
  3. El enrutamiento parte de Rails coincide con app/controllers/examples_controller.rb pero es primeras cargas 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. Sin embargo, sucede lo siguiente).
  5. Un segundo pedido se hace para /examples
  6. conjetura: Esta vez los rieles código de enrutamiento intenta utilizar su referencia en caché a app/controllers/examples_controller.rb pero las rutas de caché es corrupto (una variable es nil) debido a que el código que establece nunca se termina 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.

7

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 Error de enrutamiento y luego para las solicitudes que vienen después, responde con undefined method 'key?' for nil:NilClass y el mismo seguimiento de pila.

Esto parece ser un error con la memoria caché de clase de raíles, pero puede moverse permitiendo el almacenamiento en caché o la desactivación de clase en la carga de clase de cambio.

config.cache_classes = true 

o

config.cache_classes = false 
config.reload_classes_only_on_change = false 
Cuestiones relacionadas