问题
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.
回答1:
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. :)
回答2:
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.
回答3:
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
回答4:
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:
- The code that causes the problem, in my case, is in the model, not in the controller where I would expect it.
- 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
- Suppose we have a scaffold for Examples, with some bad code in
app/models/example.rb
- A request is made for
/examples
- The routing part of Rails matches that to
app/controllers/examples_controller.rb
but it first loadsapp/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. - 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 usingresources :examples
to make the route. The following happens regardless). - A second request is made for
/examples
- 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 isnil
) 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.
来源:https://stackoverflow.com/questions/9440325/rails-3-2-undefined-method-key-for-nilnilclass