我对使用rails路由有点困惑。我需要一些关于自定义我的网址的建议。
这是我目前的网址
http://localhost:3000/posts/product/41?product_id=2
和
http://localhost:3000/posts/product/41?model_id=24&product_id=2
这是我的链接
<%= link_to product_model.name, controller: :posts,action: :product,product_id: params[:product_id],model_id: product_model.id
逻辑上,产品应该在网址中排在第一位。但是为什么模特首先喜欢这里。
我需要这样的网址
http://localhost:3000/posts/product/41/mobile
和
http://localhost:3000/posts/product/41/mobile/nokia
由于我不熟悉rails路由,所以我的路线中没有写任何特殊编码
这是存在的简单路线
resources :posts
答案 0 :(得分:7)
好的,你的问题实际上包含两个不同的问题,所以我会给两个人提出建议。
<强> 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。漂亮网址
您的第二个问题是在您的网址中使用模型名称而不是ID。为此,simpels解决方案在您的模型上具有可以使用而不是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控制器的产品操作更改为一些安静的东西。为什么不把它移到产品型号控制器并称之为“show”?
深度嵌套资源
你应该避免将你的路线深深地嵌套。在网址中同时显示类别,子类别,产品和模型是否真的很重要?也许这就是你的模型在你的应用程序内部关联的方式,但为什么用户应该知道这一点?如果您在“/ posts / product”中没有子类别列表,并且“posts / product / 41”中的产品列表没有理由有这么长的路线。一个经验法则是“嵌套没有更深,然后两个级别”,即。 “:类别/:sub_category”。更短的路线意味着更好的SEO。
正如我所说,随意忽略这些建议,您的应用程序可以在没有这些更改的情况下运行。但是,更改这些内容将极大地帮助您构建代码,并保持代码库的清洁和可维护性。这些规则和原则不是我刚刚从无到有的变化,而是Rails社区中非常接受的原则。您可以谷歌这些原则或模式中的每一个,并查看大量文章和帖子,了解为什么遵循它们是个好主意,尤其是当您使用Rails时。
<强>资源强>
答案 1 :(得分:4)
答案 2 :(得分:1)
将其添加到model.rb
def to_param
name
end
然后添加
@model = Model.find_by_name(params[:id])
到 show 方法,然后您就可以获得上面提到的网址。
PS:您应该在架构中为模型表提供名称字段。
答案 3 :(得分:1)
我认为您正在寻找嵌套路线。请参阅此链接http://guides.rubyonrails.org/routing.html#nested-resources
如果要显示model_name而不是id,请在模型中使用to_param
方法,如@Ajay Kumar所述
def to_param
name
end
其中name是该特定模型的模型属性。
答案 4 :(得分:1)
为什么不是命名空间?
namespace :posts do
resources :products
end
这应该是我认为..
命名空间不会在范围中包含restful id ..