定制铁路路由网址

时间:2013-10-04 04:03:50

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

我对使用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 

5 个答案:

答案 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)

查看friendly-id gem

关于它有一个很棒的RailsCast

RailsCasts FriendlyID

答案 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 ..