2

Rails には、item という名前のモデルがあります。各項目はカテゴリ (別のモデル) に属し、name という属性があります。

アイテムを検索すると、URL が /item/:id として表示されます

代わりに、URL が /'item.category.name'/:id として表示されるようにします

たとえば、アイテムが「フットウェア」という名前のカテゴリに属している場合、URL を /footwear/:id として表示したいと考えています。また、「衣類」という名前のカテゴリに属する​​別のアイテムがある場合、URL を /clothing/:id として表示したいと思います。

これは可能ですか?

4

1 に答える 1

2

次のようなルートを設定すると

# 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 プレフィックスなどの既知の名前空間にプレフィックスを付け、下部のキャッチオールとしてカテゴリベースのルートを使用します。

お役に立てれば。

于 2013-08-02T03:45:39.190 に答える