【问题标题】:Rails 3 Routing: I have "/products?cat=1", I want "/art"Rails 3 路由:我有“/products?cat=1”,我想要“/art”
【发布时间】:2011-07-11 12:39:33
【问题描述】:

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

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

Products 控制器有一个索引操作,它采用可选的cat 参数。如果存在,cat 参数会将产品列表过滤为该类别中的产品。很基本的东西。

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rails-routing


    【解决方案1】:

    除非您的类别是静态的并且 slug 永远不会改变,否则您所要求的可能是不可取的。这是因为没有办法静态区分/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
    

    【讨论】:

    • 谢谢约翰。所以在这个例子中我可以使用params[:category_slug]访问category_slug?
    • CategorySlugConstraint.new 为我返回错误:TypeError (Cannot visit ActionDispatch::Request): config/routes.rb:53:in matches?'。删除 .new 即可解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多