我正在关注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的角色?
答案 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