3

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

从逻辑上讲,产品应该在 url 中排在第一位。但是为什么模型更喜欢这里。

我需要我的网址是这样的

http://localhost:3000/posts/product/41/mobile

http://localhost:3000/posts/product/41/mobile/nokia

由于我不熟悉 Rails 路线,我没有在我的路线中编写任何特殊编码

这是存在的简单路线

resources :posts 
4

5 回答 5

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.漂亮的网址

您的第二个问题是在您的 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 时。

资源

于 2013-10-14T11:30:15.647 回答
4

看看friendly-id gem

有一个很棒的RailsCast

RailsCasts FriendlyID

于 2013-10-14T11:41:06.160 回答
1

将此添加到您的模型model.rb

  def to_param
    name
  end

然后添加 @model = Model.find_by_name(params[:id])到您的show方法中,然后您可以获得上面提到的 url。

PS:您的架构中应该有模型表的名称字段。

于 2013-10-04T04:19:26.557 回答
1

我认为您正在寻找嵌套路线。请参考此链接http://guides.rubyonrails.org/routing.html#nested-resources

并在模型中使用to_param方法,如果你想显示 model_name 而不是 id 由@Ajay Kumar 解释

def to_param
  name
end

其中 name 是该特定模型的模型属性。

于 2013-10-04T06:21:47.330 回答
1

为什么不是命名空间?

namespace :posts do
  resources :products
end

我认为应该这样做..

命名空间不包括 restful id 到范围内..

于 2013-10-14T15:10:37.463 回答