4

私は The Rails 3 way の例に従っており、コンソールでディスパッチャーにリクエストを送信しようとしたときに、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 でうまく動作することを考えると、現在 ActionController.Dispatcher としての役割を果たしているのは Rails のどの部分ですか?

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']、コンソールで設定できますが、メソッドNoMethodErrorで設定されたnilオブジェクトに別のオブジェクトが表示されます。initializeしたがって、オプションハッシュをに渡すことで修正できる可能性がありますが、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 に答える