好的,您的问题实际上包含两个不同的问题,因此我将对两者都提出建议。
1. 嵌套资源
您的第一个问题是使用“嵌套路由”。Rails 指南有一篇关于路由以及如何编写和使用它们的长而好的文章,包括嵌套路由。你可以在这里查看:http: //guides.rubyonrails.org/routing.html#nested-resources。
但是,在您的情况下,解决方案将如下所示:
resources :category do
resources :sub_category do
resources :products do
resources :models
end
end
end
您现在可以增加这样的链接
<%= link_to product_model.name, category_sub_category_product_model_path(@category, @sub_category, @product, product_model) %>
您可以看到我已经删除了帖子,请参阅3. 重构设计以了解原因。如果您真的希望将其作为对帖子的操作,那么您是否应该做这样的事情(但会推荐这个!):
get "posts/product/:category_id/:subcategory_id/:product_id/:model_id", to "posts#product", as: :posts_product
这将在您的视图中像这样使用:
<%= link_to product_model.name, posts_product_path(@category, @sub_category, @product, product_model) %>
2.漂亮的网址
您的第二个问题是在您的 url 中使用模型名称而不是 id。对此的简单解决方案是在您的模型上具有一个独特的属性,您可以使用它来代替 id,然后只需添加一个to_param
方法。产品的 Fx 我们可以这样做:
class Product < ActiveRecord::Base
def to_param
name
end
end
Ryan Bates 对此做了一个很好的截屏视频:http ://railscasts.com/episodes/63-model-name-in-url-revised 。如果你想要更灵活的东西,你应该使用 gem Friendly Id。Ryan 又一次用另一个伟大的 RailsCast 来拯救:http: //railscasts.com/episodes/314-pretty-urls-with-friendlyid 。
3. 改变设计
好吧,这只是我的看法,请随意忽略它。但是他们在你的例子中有一些不好的做法和迹象,所以让我快速介绍一下我认为你应该改进的地方。
安宁的动作
您应该尽可能避免创建不宁静的控制器动作(简单地说是基本动作索引、显示、新建、创建、编辑、更新和销毁唯一的宁静动作)。在您的示例中,这是否意味着应该将帖子控制器的产品操作更改为安静的东西。为什么不将其移至产品模型控制器并称之为“展示”?
深度嵌套的资源
你应该避免将你的路线嵌套得很深。在您的网址中同时显示类别、子类别、产品和型号真的很重要吗?也许这就是您的模型在应用程序内部的关联方式,但用户为什么要知道这一点?如果您在“/posts/product”处没有子类别列表,在“posts/product/41”处没有产品列表,那么没有理由走这么长的路线。一个经验法则是“巢不深于两层”,即。“:类别/:子类别”。此外,短路线意味着更好的 SEO。
正如我所说,请随意忽略这些建议,您的应用程序将在没有这些更改的情况下运行。但是,更改这些内容将极大地帮助您构建代码,并保持代码库的清洁和可维护性。这些规则和原则不是我凭空想象出来的,而是 Rails 社区非常接受的原则。您可以在 Google 上搜索这些原则或模式,并查看很多文章和帖子,说明为什么遵循它们是一个好主意,尤其是当您使用 Rails 时。
资源