4

我正在遵循 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 的角色?

4

2 回答 2

4

这是 Rails边缘指南对主要 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']

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

于 2013-01-14T03:54:40.743 回答
3

它已被移动到 ActionDispatch (actionpack/lib/action_dispatch),可以在这里找到:actionpack/lib/action_dispatch/routing/route_set.rb,类名为

ActionController::Routing::RouteSet::Dispatcher.new
于 2012-07-03T04:33:44.570 回答