Rails在show actions上路由产品类别的URL文件夹

时间:2013-09-07 18:34:21

标签: ruby-on-rails url routing routes

我正在尝试为我所拥有的“产品”模型制定一些更好的网址,仅限于展示动作。我目前正在使用friend_id来生成相当多的slug,这很好,但是如果可以的话,我正在尝试改进URL流程。

目前我的路径就像这样工作

    example.com/products/pretty-url-slug

保存parictular产品(到产品型号)时,我还保存了type_of属性。哪个可能是android,iphone,windows

所以我试图最终拥有像这样的强大URLS

    example.com/products/iphone/pretty-url-slug

问题是,我没有或者相信我想要一个真正的“iphone”,“android”等控制器。但我宁愿只更新路由的组合并显示动作来正确处理这个问题。

到目前为止,我试图通过在路由上使用catch all来解决这个问题,但是无法正常工作。是否有任何建议或不同方式来处理这个问题?

           routes

           resources :products

           # at the bottom of my routes a catch all
           match '*products' => 'products#show'

           # match routes for later time to do something with to act like a  
           # normal category page. 
           match 'products/iphone' => 'products#iphone_index'
           match 'products/android' => 'products#android_index'
           match 'products/windows' => 'products#windows_index'

           show action in the products controller

               def show
                # try to locate the product
                 if params[:product].present?
                  slug_to_lookup = params[:product].split("/").last
                  type_of  = params[:product].split("/").second
                  @product = Product.find_by_slug(slug_to_lookup)
                else
                  @product = Product.find_by_slug(params[:id])
                end


               # redirect if url is not the slug value
               if @product.blank?
                redirect_to dashboard_path
              elsif request.path != product_path(@product)
                redirect_to product_path(@product)
              end
             end

这种方式可以解决问题,但是我无法确定如何附加type_of属性并生成有效的URL。

2 个答案:

答案 0 :(得分:1)

如何定义这样的路线:

获取':controller /:action /:id /:user_id'

此处,除了:controller或:action之外的任何内容都将作为params的一部分用于操作。

答案 1 :(得分:0)

感谢您的建议。当我想到它时,我实际上能够解决这个问题并且非常简单。这可能对其他人有帮助。

在我的路线中,我刚为我所拥有的每种类别创建了一条路线。所以每次新的类别,我都需要添加一条额外的路线,例如:

    # match for each product category
    match 'shop/iphone/:slug' => 'products#show', :as => :product_iphone
    match 'shop/android/:slug' => 'products#show', :as => :product_android
    match 'shop/windows/:slug' => 'products#show', :as => :product_windows

然后在产品的show动作中而不是指导,你只需渲染产品/展示slug是否与现有产品匹配

   @product = Product.find_by_slug(params[:slug])

然后在您的观看中,您可以链接到这样的特定类别

   link_to "product", product_android_path(@product)