1

DocumentsController#common_query は、複数の異なるリクエスト スタイルを処理できます。

つまり、バッチ 4 のすべてのドキュメント、または「happy」とタグ付けされたすべてのドキュメント

emをきれいにするために単一のルートが必要なので、次のようにします。

/documents/common_query?batch=4

/documents/common_query?tag=ハッピー

なる:

/ドキュメント/バッチ/4

/ドキュメント/タグ/ハッピー

したがって、最終結果は #common_query が呼び出されますが、URL の一部がパラメーター名として使用され、一部が値として使用されます。

4

2 に答える 2

1

2つのルートを使用する2番目のオプションは、サポートするURLの種類にのみ一致するため、ほぼ確実に適しています。最初のオプションは、/ document / foo/barなどのURLにも「一致」します。これにより、#common_queryメソッドがせいぜいRecordNotFound(404)応答を返す可能性があります。最悪の場合、予想されるパラメータを表示する準備ができていない場合は、代わりに500エラーが発生します...

もちろん、バリエーションがたくさんあると、ルートもたくさんなってしまいます。また、/ document / batch / 4 / tag / happyなど、これらを組み合わせて使用​​する必要がある場合は、ワイルドカードルートを使用し、コントローラーでパラメーター処理を行う必要があります。これは次のようになります。

map.connect 'documents/*specs', :controller => "documents_controller", :action => "common_query"

URLのさまざまな要素は、コントローラーでparams [:specs]として使用できます。あなたはそれをそのような発見に変えるかもしれません:

@items = Item.find(:all, :conditions => Hash[params[:specs]])

このHash[]手法は、オプションの1次元配列をキー値ハッシュに変換します。これは、find()に直接フィードしない場合でも役立つ可能性があります。

于 2008-12-04T11:20:46.247 に答える
0

単一のルートとして:

ActionController::Routing::Routes.draw do |map|
  map.connect "documents/:type/:id", :controller => "documents_controller", 
              :action => "common_query"
end

次に、または、およびまたはまたはのparams[:type]いずれかになります。これは."batch""tag"params[:id]"4""happy"DocumentsController"documents/*/*"

しかし、なぜ単一のルートでなければならないのでしょうか。次のように 2 つのルートを使用できます。

map.with_options(:controller => "documents_controller", 
                 :action => "common_query") do |c|
  c.connect "documents/batch/:page", :type => "batch"
  c.connect "documents/tag/:tag",    :type => "tag"
end

これは同じ効果がありますが、より具体的であるため、ルートの優先順位について心配する必要はありません。

于 2008-12-04T08:16:46.820 に答える