Rails 3.2 undefined method `key?' for nil:NilClass
Asked Answered
H

4

22

For some reason I started to get this error after switching to Rails 3.2. I guess it has something to do with acl9 plugin, which I tried reinstalling, but nothing changed.

I moved the plugins to lib/plugins and added initializer to config/initializers but again, same error.

I looked for solution at acl9 repo on Github, but could not find anything there. Maybe it is not acl9 after all.

I have paperclip, acl9, authlogic installed.

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'

EDIT (SOLVED): It took quite a while to figure out and I am still not quite sure what happened. I think it has to do with acl9's support for Rails 3.1+ But in the end I took the acl9 code from github and everything suddenly started working.

Heelpiece answered 25/2, 2012 at 1:35 Comment(0)
B
16

I am a newbie to RoR and got the same error while going through RoR "Getting started guide".

This may sound silly, but others might make the same mistake as I am, so posting what I noticed in RoR from newbie's eyes,

validates :name,  : presence => true

Note ": presence", it should be ":presence". Now the Rail throws a Syntax error

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

But if you "Refresh" Your browser, it hides the syntax error, instead gives

undefined method `key?' for nil:NilClass

It seems Rails caching is the culprit. :)

Blanket answered 1/10, 2012 at 5:40 Comment(3)
yeah that is actually usually the case.. that's how I came across this problem at least. I will accept the answer until someone can provide a deeper insight..Heelpiece
I do Rails professionally, and valdiates still is not the same thing as validates.Loesceke
for future reference - had the same problem because of a typo: i wrote validate instead of validatesPrimm
E
9

This may not be your issue as it sounds like you already had working code to begin with, but for future reference for others, I ran into the same error due to a simple typo inside my model code, like so:

class Foo < ActiveRecord::Base
    validates :content, :length => { maximum => 10 }
end

which should have been:

class Foo < ActiveRecord::Base
    validates :content, :length => { :maximum => 10 }
end

Note the "maximum" vs. ":maximum" -- this resulted in the exact nil error above, and went away when I fixed that typo.

Eudemonism answered 3/3, 2012 at 6:26 Comment(0)
H
7

Not sure if this is the same bug, but I was having a similar issue. On a first load of a buggy model, Rails responds with a Routing error and then for the requests coming afterwards it responds with undefined method 'key?' for nil:NilClass and same stack trace.

This looks to be a bug with Rails class caching, but can get around by enabling class caching or disabling on change class reloading.

config.cache_classes = true

or

config.cache_classes = false
config.reload_classes_only_on_change = false
Heisser answered 18/6, 2012 at 8:40 Comment(0)
C
6

I agree with bmoeskau that you should check your model code for bugs. To my surprise, models apparently sometimes get loaded during the routing phase. I discovered:

  1. The code that causes the problem, in my case, is in the model, not in the controller where I would expect it.
  2. The undefined method `key?' for nil:NilClass error often only occurs after the first time I access the page.

As far as I can tell, what happens is

  1. Suppose we have a scaffold for Examples, with some bad code in app/models/example.rb
  2. A request is made for /examples
  3. The routing part of Rails matches that to app/controllers/examples_controller.rb but it first loads app/models/example.rb. I don't know why it loads the model, but the effect is, I conjecture: The error in the model stops short a part of the routing code, corrupting its construction of a cache of routes.
  4. At this point, if I'm lucky the error will be reported back to me in the browser. Sometimes, however, I simply get a message saying No route matches [GET] "/examples" (To be fair to Rails, this added complication seems to be the fault of not using resources :examples to make the route. The following happens regardless).
  5. A second request is made for /examples
  6. Conjecture: This time the Rails routing code tries to use its cached reference to app/controllers/examples_controller.rb but the routes cache is corrupt (a variable is nil) because the code that sets never finished running.

This last item is most annoying because the problem that caused it (the bad code in the model) isn't even being run.

Charade answered 3/3, 2012 at 18:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.