2013-10-04 68 views
3

我在使用导轨路线时有点困惑。我需要一些关于自定义我的网址的建议。定制导轨路由网址

这是我当前的URL

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

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

以下是存在的简单路线

resources :posts 
+1

可以使用友好-ID的宝石。 –

+0

@AmitSharma是的,我只使用friendly-id,但我可以像上面那样工作 – overflow

+0

@Seting,在您当前的URL中,“41”代表什么? –

回答

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 

瑞安贝茨已经取得了不错的截屏这一点:http://railscasts.com/episodes/63-model-name-in-url-revised。如果您想使用宝石Friendly Id更灵活。 Ryan又一次用另一个伟大的RailsCast来拯救:http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

3.更改设计

好舒服,所以这只是我的意见,随时忽略它。但是他们的例子中有一些不好的做法和迹象,所以让我快速浏览一下我认为你应该改进的地方。

宁静行动

你应该尽可能总是避免创建控制器动作不是宁静(简单地说是基本动作指数,显示,新,创建,编辑,更新和销毁只有宁静行动)。在你的例子中,这是否意味着帖子控制器的产品动作​​应该改变为宁静。为什么不把它移到产品模型控制器并称之为“show”?

深度嵌套资源

你应该避免嵌套的路线深入。在网址中显示类别,子类别,产品和模型是否非常重要?也许这就是你的模型在你的应用程序内部是如何关联的,但为什么用户应该知道这一点?如果您在“/ posts/product”没有子类别列表,并且“posts/product/41”中的产品列表没有理由有这么长的路线。经验法则是“嵌套不深于两层”,即。 “:类别/:sub_category”。更短的路线意味着更好的搜索引擎优化。

正如我所说的,随意忽略这些建议,您的应用程序将工作没有这些变化。然而,改变这些东西将大大帮助你构建代码,并保持你的代码库清洁和可维护。这些规则和原则并不是我刚从无到有,但在Rails社区中非常公认的原则。你可以谷歌每个这些原则或模式,并看到很多文章和帖子,为什么这是一个好主意,按照他们,特别是当你使用Rails。

资源

1

model.rb

def to_param 
    name 
    end 

添加到您的模式,然后添加 @model = Model.find_by_name(params[:id])显示方法,那么您可以根据上述获得的URL。

PS:你应该有领域模式表中您模式

1

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

,如果你想通过@Ajay库马尔

def to_param 
    name 
end 

其中name是针对特定模型的模型属性解释,而不是显示ID的模型名称使用to_param方法在模型中。

1

为什么不命名空间很大RailsCast

namespace :posts do 
    resources :products 
end 

这应该做我想..

命名空间不包括宁静的ID添加到范围..