Rails 3.2中的ActionController :: Dispatcher在哪里?

时间:2012-07-03 04:29:03

标签: ruby-on-rails rack dispatcher

我正在关注The Rails 3中的示例,当我尝试使用ActionController::Dispatcher.new.call(env).last.body

向控制台中的调度程序发送请求时

我得到了

1.9.3p194 :001 > ActionController::Dispatcher.new.call(env).last.body NameError: uninitialized constant ActionController::Dispatcher'

我使用rails 3.2.6,我检查了rails api,发现他们在ActionController中删除了调度程序,但rails指南说: ActionController :: Dispatcher.new是Rails的主要Rack应用程序对象应用。任何符合Rack的Web服务器都应该使用ActionController :: Dispatcher.new对象来为Rails应用程序提供服务。

我找到了rails api的v3.0.7,Dispatcher仍然存在于该版本中。

所以,这是我的问题:如何找到作为ActionController.Dispatcher.new的等效方法?鉴于我的应用程序与rails 3.2.6配合良好,哪一部分rails现在扮演ActionController.Dispatcher的角色?

2 个答案:

答案 0 :(得分:4)

这是Rails edge 指南关于主要Rack应用程序对象的说法:

  

ApplicationName :: Application是Rails应用程序的主要Rack应用程序对象。任何符合Rack的Web服务器都应该使用ApplicationName :: Application对象来提供Rails应用程序。

所以ActionController::Dispatcher.new刚刚被ApplicationName::Application取代。我不确定他们什么时候做这个转换。这对我有用:

Blog::Application.call(env).last.body  


NoMethodError: undefined method 'key?' for nil:NilClass之后的前几行告诉我们key?方法正在actionpack-3.2.11/lib/action_dispatch/routing/route_set.rb中调用。从那里向后工作,我们可以看到变量

params = env['action_dispatch.request.path_parameters']
当它不应该是

是零。因此,我们可以在控制台中设置env['action_dispatch.request.path_parameters'],但这会在NoMethodError方法中的nil对象集上导致另一个initialize。所以我们可以通过将选项哈希值传递给Dispatcher.new来解决这个问题,但最好只使用ApplicationName::Application。)

答案 1 :(得分:3)

它已移至ActionDispatch(actionpack / lib / action_dispatch),可在此处找到: actionpack / lib / action_dispatch / routing / route_set.rb ,类名为

ActionController::Routing::RouteSet::Dispatcher.new