2

私はRailsにかなり慣れていないので、ルーティング構成に混乱しています。

私のプロジェクトには、製品とカテゴリの2つのモデルがあります。製品belongs_toカテゴリ、カテゴリhas_many製品。

Productsコントローラーには、オプションのパラメーターをとるインデックスアクションがありますcat。存在する場合、catパラメータは製品のリストをそのカテゴリ内の製品にフィルタリングします。かなり基本的なもの。

私が望んmysite.com/artいるのは、と同じ結果をmysite.com/products?cat=1出すことです。ここで、「art」はカテゴリ1のスラッグです。製品用を含む、他のいくつかのリソースのあるルートを定義しています。

resources :products do
  collection do
    get 'search_by_color'
  end
end

私も指摘/products/some-product-slugしたいproducts#show

Rails 3を使用しています。このルーティング設定を実行するにはどうすればよいですか?

4

1 に答える 1

3

カテゴリが静的でスラッグが変更されない場合を除いて、求めているものはおそらくお勧めできません。/artこれは、と、たとえば、、/aboutなどの違いを静的に区別する方法がないためです/contact。また、あまりRESTfulではないため、Railsによって多少嫌われています。

とはいえ、とにかくそれを実行したい場合は、要求制約を作成する必要があります。これはmatches?、単一の引数(一致する要求)に応答して受け入れるオブジェクトです。trueが返された場合、ルートは一致し、指定した方法でルーティングされます。たとえば、次のように書くことができます。

match '/:category_slug' => 'products#index',
  :constraints => CategorySlugConstraint.new

class CategorySlugConstraint
  def matches?(request)
    Category.find_by_slug ...
  end
end
于 2011-07-09T14:35:11.717 に答える