2

我对 Rails 相当陌生,发现自己对路由配置感到困惑。

在我的项目中,我有 2 个模型:产品和类别。产品属于_to Category,Category has_many Product。

Products 控制器有一个 index 动作,它带有一个可选cat参数。当存在时,cat参数将产品列表过滤为该类别中的产品。很基本的东西。

想要的是获得mysite.com/art与 相同的结果mysite.com/products?cat=1,其中“艺术”是类别 1 的 slug。我定义了其他几条资源丰富的路线,包括一条用于产品的路线:

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

我也想/products/some-product-slug指出products#show

我正在使用 Rails 3。如何进行此路由设置?

4

1 回答 1

3

除非您的类别是静态的并且 slug 永远不会改变,否则您所要求的可能是不可取的。那是因为没有办法静态地区分/artand ,比如 ,/aboutor/contact等​​。它也不是很 RESTful,因此 Rails 有点不赞成。

也就是说,如果你想这样做,你应该写一个request constraint。这是响应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 回答