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

我将插件移动到lib / plugins并添加初始化程序以配置/ initializers,但再次,相同的错误。

我在github上寻找ACL9 repo的解决方案,但在那里找不到任何东西。也许毕竟不是ACL9。

我有纸盒,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'
.

编辑(解决):弄清楚需要很长一段时间,我仍然不太确定发生了什么。我认为它与ACL9对Rails的支持有关3.1+,但最终我从GitHub中拍摄了ACL9代码,一切突然开始工作。

有帮助吗?

解决方案

我是一个新手,并通过ROR“入门指南”时获得了相同的错误。

这可能听起来很傻,但其他人可能会像我一样犯同样的错误,所以发布了我在纽伯的眼中所注意到的,

validates :name,  : presence => true
.

注意“:存在”,它应该是“:存在”。现在轨道抛出了语法错误

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

但如果您“刷新”浏览器,它隐藏了语法错误,而是给出

undefined method `key?' for nil:NilClass
.

似乎轨道缓存是罪魁祸首。:)

其他提示

这可能不是您的问题,因为它听起来已经有了工作代码,但对于其他人的未来参考,我遇到了我的模型代码内的简单拼写错误,如下所示:

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

应该是:

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

注意“最大”与“:最大” - 这导致上面的精确误差,当我修复拼写错误时会消失。

不确定这是否是同一个错误,但我有一个类似的问题。在第一个负载越来越多的错误模型中, Rails 响应路由错误,然后对于之后的请求,它响应undefined method 'key?' for nil:NilClass和相同的堆栈跟踪。

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

config.cache_classes = true
.

config.cache_classes = false
config.reload_classes_only_on_change = false
.

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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top