次のようなルートを設定すると
# config/routes.rb
RouteTest::Application.routes.draw do
get ':category_name(/:id)', to: 'items#show', constraints: {id: /\d+/}
end
これは ItemsController の show アクションにマップされ、そこで params[:category_name] と params[:id] にアクセスできます。この情報を使用して、必要なデータを取得してレンダリングできるはずです。
ただし、このルートは、後続のルートをマスキングするという望ましくない影響を与える可能性があることに注意してください。レールの高度なルート制約を使用して、「有効なカテゴリ名と見なされる値」をさらに絞り込むことができますが、これは非常にスケーラブルまたは管理可能なアプローチではありません。
たとえば、次のようなことができます
RouteTest::Application.routes.draw do
get ':brand_name(/:id)', to: 'items#show', constraints: lambda { |request| BrandList.include?(request.params[:brand_name]) }
# etc. ...
get ':category_name(/:id)', to: 'items#show'
end
ただし、これが実際にうまく機能するのは、BrandList がアプリケーションの初期化中に設定できる有限リストである場合のみです。
より優れたスケーラブルなアプローチは、URL を次のように設計することです。
/brand/adidas
/brand/teva
/shoes/1
/shoes/2
/jackets/45
IOW、brand
適切な人に優しい URL プレフィックスなどの既知の名前空間にプレフィックスを付け、下部のキャッチオールとしてカテゴリベースのルートを使用します。
お役に立てれば。