2015-06-18 29 views
0

现在有两种模式:类别和产品。类别是自我加入以创建子类别。类别has_many产品,当然属于_类别。Rails - 具有自我加入模式的SEO友好网址

我有这样的问题:我如何映射这些资源的路线,使他们有SEO友好的URLS。

例如:如果用户点击“Lamas”类别,然后点击“Maintenence”子类别,然后最后点击“Lama Polish”产品。路径将是: http://lamasareawesome.com/categories/1/categories/26/products/11

我要的是: http://lamasareawesome.com/lamas/maintenence/lama-polish

到目前为止我不是运气不好微调控制器名称出路径,并与一个模型属性替换它。

+0

你可能要看看[** friendly_id **](https://github.com/norman/friendly_id) – Pavan

+0

[This SO question](http://stackoverflow.com/questions/7735315/rails-路由到用户名,而不是ID)也非常类似于你的。 'friendly_id'或'to_param'是两种不同的方式来处理它。 – sjagr

+0

谢谢你们的伟大建议。我不知道这些宝石。 – greyoxide

回答

1

创建使用ID以外的其他属性的路由非常简单。 FriendlyID大出的现成的解决方案,但它只会让你看起来像网址:

/categories/lamas/categories/maintenance/products/lama-polish 

创建网址的如lamas/maintenence/lama-polish绝对是可能的,但会因为它不是传统的困难,而且也有很多潜在的隐患。

例如,你可以在开始时:

resources :categories, path: '/' do 
    resources :categories, path: '' do 
    # resources :products 
    end 
end 

,这将创造:

   Prefix Verb URI Pattern      Controller#Action 
    category_categories GET /:category_id(.:format)   categories#index 
         POST /:category_id(.:format)   categories#create 
new_category_category GET /:category_id/new(.:format)  categories#new 
edit_category_category GET /:category_id/:id/edit(.:format) categories#edit 
    category_category GET /:category_id/:id(.:format)  categories#show 
         PATCH /:category_id/:id(.:format)  categories#update 
         PUT /:category_id/:id(.:format)  categories#update 
         DELETE /:category_id/:id(.:format)  categories#destroy 
      categories GET /        categories#index 
         POST /        categories#create 
      new_category GET /new(.:format)     categories#new 
     edit_category GET /:id/edit(.:format)    categories#edit 
       category GET /:id(.:format)     categories#show 
         PATCH /:id(.:format)     categories#update 
         PUT /:id(.:format)     categories#update 
         DELETE /:id(.:format)     categories#destroy 

但后来有一个超大型的疑难杂症 - 让我们说的请求是

GET /lamas/joe-the-lama 

Rails应该如何知道这个需求est应该由LamasController处理,而不是CategoriesController?你将不得不为两者做一个数据库查询。当然这不是问题,如果你总是有两个类别,但你得到了我的漂移 - 事情会变得复杂得很快。

标准的Rails风格安静的路由可能有点罗嗦,但它确实避免了很多潜在的歧义。

+0

谢谢你的辛勤工作。我可以看到你为了演示路线而创建了一个rails应用程序。我想我同意你的看法。在经历了很多苦苦挣扎后,我决定依靠面包屑尝试建立一些连续性。我遇到的另一个问题是:如果父类别包含产品和子类别,会发生什么情况。我的大脑仍然疼痛! – greyoxide

+0

这可能是一个好主意,像这样的路由对于大多数静态内容/博客来说工作得很好,其中结构在某种程度上是固定的。但是,当你处理真正的REST应用程序时,它会变得非常混乱,它可以在不同层次上嵌套。 如果你想在Wordpress [WP_Query类](https://codex.wordpress.org/Class_Reference/WP_Query)中看到一个真正的噩梦,它会尝试将URL解析,路由匹配和数据库查询全部卷入这个巨大的craptastic类。警告:已知会导致粗糙的语言和不自觉地在工作场所中抛掷物体。 – max