Ruby on Rails で /similar-to-:product のような URL をサポートしますか?
-
02-07-2019 - |
質問
Web サイトの URL /similar-to-:product (product が動的) を作成するために、routes.rb を使用しようとしています。問題は、routes.rb は /:product-similar のような URL をすぐにサポートしますが、前者はサポートしないことです。これは、:product の前に区切り文字を付ける必要があるためです (「/」は区切り文字ですが、「-」は区切り文字ではありません)。セパレータのリストは ActionController::Routing::SEPARATORS にあります。
:product にはハイフンも含めることができるため、区切り文字として「-」を追加することはできません。このような URL をサポートする最善の方法は何ですか?
私が試して成功した方法の 1 つは、routes.rb を使用せず、URL 解析ロジックをコントローラー自体に組み込むことですが、これは最もクリーンな方法ではありません。
解決
実際に追加することもできます -
区切り文字として使用する場合は、ルート グロビングを使用します。
map.similar_product '/similar-to-*product', :controller => 'products', :action => 'similar'
次に、ProductsController#similar で
@product = Product.find_by_slug params[:product].join('-')
リファクタリングの方が優れているように見えますが、このアプローチではハイフンを含む可能性のあるすべてのスラッグを特別に処理する必要があるためです。
他のヒント
URL が単に「/product に似ている」ようにリファクタリングします。
簡単な解決策は、 ルーティングフィルター. 。詳細については、READMEを参照してください。
ルーティングフィルターを使用すると、URLを取得できます /similar-to-:product
, 、それを前処理します /similar-to/:product
ルーティング認識に至る前に。また、生成されたパスを後処理して戻すこともできます。 /similar-to/:product
に /similat-to-:product
.
少し混乱していますが、区切り文字として「to-」を追加していただけますか?