Rails 3.2 undefined method `key?' for nil:NilC

2019-01-17 20:37发布

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.

4条回答
够拽才男人
2楼-- · 2019-01-17 20:59

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
查看更多
做个烂人
3楼-- · 2019-01-17 21:04

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. :)

查看更多
爷的心禁止访问
4楼-- · 2019-01-17 21:06

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.

查看更多
Rolldiameter
5楼-- · 2019-01-17 21:06

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.

查看更多
登录 后发表回答