Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 自定义rails路由url_Ruby On Rails_Ruby On Rails 3_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 自定义rails路由url

Ruby on rails 自定义rails路由url,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 4,我在使用rails路线时有点困惑。我需要一些关于定制我的url的建议 这是我当前的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_i

我在使用rails路线时有点困惑。我需要一些关于定制我的url的建议

这是我当前的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

将其添加到
model.rb中的模型中

  def to_param
    name
  end
然后加上
@model=model。通过_name(params[:id])
找到您的show方法,然后您可以获得上面提到的url


PS:您的模式中应该有模型表的名称字段

我想您正在寻找嵌套路由。请参考此链接

如果要显示模型名称而不是@Ajay Kumar解释的id,请在模型中使用
to_param
方法

def to_param
  name
end

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

好的,您这里的问题实际上包含两个不同的问题,因此我将对这两个问题给出建议

1。嵌套资源

第一个问题是使用“嵌套路由”。Rails指南有一篇关于路由以及如何编写和使用路由(包括嵌套路由)的长而好的文章。您可以在这里查看:

但是,在您的情况下,解决方案会是这样的:

resources :category do
  resources :sub_category do
    resources :products do
      resources :models
    end
  end
end
class Product < ActiveRecord::Base
  def to_param
    name
  end
end
你现在可以像这样的链接

<%= link_to product_model.name, category_sub_category_product_model_path(@category, @sub_category, @product, product_model) %>
在您的视图中会这样使用:

<%= link_to product_model.name, posts_product_path(@category, @sub_category, @product, product_model) %>
Ryan Bates对此做了一个很好的放映:。如果你想要更灵活的东西,你应该使用gem。瑞安又一次带着另一位伟大的铁路工人前来救援

3。改变设计

好吧,这只是我的观点,请忽略它。但在你们的例子中,他们有一些不好的做法和迹象,所以让我快速地介绍一下我认为你们应该改进的地方

平静的行为

如果可能,您应该始终避免创建非restful的控制器操作(简单地说就是基本操作索引、显示、新建、创建、编辑、更新和销毁唯一的restful操作)。在您的示例中,这是否意味着posts控制器的产品操作应该更改为restful。为什么不将其移动到产品模型控制器并称之为“显示”

深度嵌套资源

你应该避免将你的路线嵌套到很深的地方。在url中同时显示类别、子类别、产品和模型真的很重要吗?也许这就是应用程序中模型的内部关联方式,但是用户为什么要知道这一点呢?如果在“/posts/product”中没有子类别列表,在“posts/product/41”中没有产品列表,那么就没有理由有这么长的路线。经验法则是“嵌套不超过两个级别”,即“:category/:sub_category”。此外,短路线意味着更好的搜索引擎优化

正如我所说的,请忽略这些建议,您的应用程序将在没有这些更改的情况下工作。然而,更改这些内容将极大地帮助您构建代码,并保持代码库的干净性和可维护性。这些规则和原则不是我凭空想出来的,而是Rails社区中非常公认的原则。您可以在谷歌上搜索这些原则或模式中的每一个,并看到许多关于为什么遵循它们是一个好主意的文章和帖子,尤其是在使用Rails时

资源

看看

这是一个伟大的故事

为什么不使用名称空间

namespace :posts do
  resources :products
end
我想这应该可以


命名空间未将restful Id包含在作用域中。

您可以使用友好Id gem。@AmitSharma是的,我只使用友好Id,但我可以将其用作above@Seting,在您当前的URL中,“41”代表什么?@b.rad我有四个关系
category、sub-category、product和model
41是sub-category id
class Product < ActiveRecord::Base
  def to_param
    name
  end
end
namespace :posts do
  resources :products
end