Ruby-on-rails Rails 3.2 未定义的方法`key?' 对于零:NilClass

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9440325/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 02:54:15  来源:igfitidea点击:

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

ruby-on-railspluginsruby-on-rails-3.2nomethoderror

提问by Stpn

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.

出于某种原因,我在切换到 Rails 3.2 后开始收到此错误。我想这与 acl9 插件有关,我尝试重新安装它,但没有任何改变。

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

我将插件移动到 lib/plugins 并将初始化程序添加到 config/initializers 但同样,同样的错误。

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

我在 Github 上的 acl9 存储库中寻找解决方案,但在那里找不到任何东西。也许它毕竟不是acl9。

I have paperclip, acl9, authlogic installed.

我安装了回形针、acl9、authlogic。

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.

编辑(已解决):花了很长时间才弄明白,我仍然不太确定发生了什么。我认为这与 acl9 对 Rails 3.1+ 的支持有关,但最后我从 github 上获取了 acl9 代码,一切突然开始工作。

采纳答案by Lakthinda Ranasinghe

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

我是 RoR 的新手,在浏览 RoR“入门指南”时遇到了同样的错误。

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,

这听起来可能很傻,但其他人可能会犯和我一样的错误,所以从新手的角度发布我在 RoR 中注意到的内容,

validates :name,  : presence => true

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

注意“:presence”,应该是“:presence”。现在 Rail 抛出一个语法错误

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

看来 Rails 缓存是罪魁祸首。:)

回答by Brian Moeskau

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.

注意“maximum”与“:maximum”——这导致了上面的 nil 错误,当我修正了那个错字时就消失了。

回答by Laknath

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

不确定这是否是相同的错误,但我遇到了类似的问题。在错误模型的第一次加载时,Rails路由错误进行响应,然后对于之后到来的请求,它以undefined method 'key?' for nil:NilClass相同的堆栈跟踪进行响应。

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

这看起来是Rails 类缓存的错误,但可以通过启用类缓存或禁用更改类重新加载来解决。

config.cache_classes = true

or

或者

config.cache_classes = false
config.reload_classes_only_on_change = false

回答by redevelops

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

我同意 bmoeskau 的观点,即您应该检查您的模型代码是否存在错误。令我惊讶的是,模型有时会在路由阶段加载。我发现:

  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:NilClasserror often only occurs after the first time I access the page.
  1. 就我而言,导致问题的代码在模型中,而不是在我期望的控制器中。
  2. undefined method `key?' for nil:NilClass错误通常只发生在我第一次访问该页面之后。

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.rbbut it firstloads 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 :examplesto 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.rbbut the routes cache is corrupt (a variable is nil) because the code that sets never finished running.
  1. 假设我们有一个用于示例的脚手架,其中包含一些糟糕的代码 app/models/example.rb
  2. 提出了一个请求 /examples
  3. Rails 的路由部分与 to 匹配,app/controllers/examples_controller.rb但它首先加载app/models/example.rb. 我不知道它为什么加载模型,但我猜想的结果是:模型中的错误使一部分路由代码停止,破坏了它对路由缓存的构建。
  4. 此时,如果我幸运的话,错误会在浏览器中报告给我。然而,有时我只是收到一条消息说No route matches [GET] "/examples"(公平地说,这个增加的复杂性似乎是不使用resources :examples路由的错误。无论如何都会发生以下情况)。
  5. 第二个请求是 /examples
  6. 猜想:这次 Rails 路由代码尝试使用其缓存引用,app/controllers/examples_controller.rb但路由缓存已损坏(变量为nil),因为设置的代码从未完成运行。

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

最后一项最烦人,因为导致它的问题(模型中的错误代码)甚至没有运行。