4

ホストをチェックするために制約を使用しているルートと、本質的に同じであるがホスト制限のないルートがあります (これらは実際には名前空間ですが、物事を簡単にするために、この例で行います):

 match "/(:page_key)" => "namespace_one/pages#show", :constraints => proc {|env| env['SERVER_NAME'] == 'test.mysite.local' }

 match "/(:page_key)" => "namespace_two/pages#show"

get "/page_key"これらは、ブラウザ経由でアクセスするときや、ホストを定義して実行するときの統合テストなどで、期待どおりに機能します。

ただし、これらのルートが機能することを確認するテストを作成したいのですが、これまでのところ、次のテスト (現在ActionController::IntegrationTestホストを設定できるようになっている) が制約のないものと一致しているため、あまり運がありません。

assert_routing '', { :controller => 'namespace_one/pages', :action => 'show' }
=> The recognized options <{"action"=>"show", "controller"=>"frontend/pages"}> 
   did not match <{"action"=>"show", "controller"=>"namespace_two/pages"}>, 
   difference: <{"controller"=>"namespace_one/pages"}>

Constraint proc で env をダンプしようとすると、得られるのは--- :controller.

assert_routing を取り除き、get :show呼び出しとダンプを実行@controllerすると、正しいコントローラーに解決されます (これらのルートはすべて HTTP 要求を介して正常に機能するため、予想どおり)。

4

1 に答える 1

7

自分でこの問題を抱えていました。これは、ルーティング テストで完全な URL を指定できるようにする Rails パッチによって修正されました。

テストを次のように変更します

assert_routing 'http://test.mysite.local', { :controller => 'namespace_one/pages', 
                                             :action => 'show' }

そしてそれはうまくいくでしょう。

完全な URL に「://」を含める必要があります。b/c rails は正規表現を使用してパス内の %r{://} を探します。そうしないと、URL のホスト部分が自動的にハックされ、テストが行​​われます。エラーアウト。

于 2010-12-16T21:53:53.510 に答える