这样做:
#config/routes.rb
resources :categories, path: "" do
resources :product, path: "" do
resources :item, path: ""
end
end
这将创建下列网址:url.com/:category_id/:product_id/:id
,您就可以使用以下link_to
帮手:
<%= link_to @item.title, [@category, @product, @item] %>
-
虽然它应该可以工作,但它是not recommended:
资源永远不应嵌套超过1级。
因此,你不妨重构你的路由/基础设施,使你打电话item_id
上述所有 - product
& categories
作为索引方法:
#config/routes.rb
resources :categories, path: "", only: :index
resources :products, only: :index do
resources :items
end
这将允许你打电话<%= link_to "Products", products_path %>
获取产品清单,然后<%= link_to @item.id, products_item_path(@product, @item) %>
获取特定项目。
您也不妨看看friendly_id
这将无助于你的路由(它驻留在你的模型) - 它基本上可以让你使用slug
s识别您的资源(而不是id
的)。
我可以更新答案,如果你想知道更多关于它;基本上它可以让你有喜欢的网址:
url.com/:category_id/:product_id/:item
url.com/category-name/product-name/item-name
友好ID
友好ID只是代替你的路由/ find
方法与slug
参数的时:id
参数。要设置friendly_id
,您基本上需要为模型添加slug
属性(通过迁移),然后在模型本身中包含FriendlyID
类。
这里是你怎么想设置它:
# config/routes.rb
resources :categories, path: "" do
resources :subcategories, path: "" do
resources :products, path: "" # => http://url.com/:category_id/:subcategory_id/:product_id
end
end
必须注意的是,嵌套足智多谋的路线是深刻的是not recommended(我会离开它证明做什么)。
Rails将采取上述操作并创建一个路由帮助程序,如category_subcategory_product_path(:category, :subcategory, :product)
。
通过为这些值中的每一个传递对象,“裸”Rails将仅从它们推断出id
。 FriendlyID
(如果设置正确)应在所有这些模型中将id
替换为slug
列。
您需要设置它像下面这样:
# app/models/category.rb
class Category < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:finders, :slugged]
end
# app/models/subcategory.rb
class Subcategory < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:finders, :slugged]
end
# app/models/product.rb
class Product < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: [:finders, :slugged]
end
这一点 - 如果迁移,每机型的包括一个slug
列 - 让Rails的填充与slug
对象的路径帮手。当然,这并不重要,如果你只是用肉眼值反正:
category_subcategory_product_path(@category.slug, @subcat.slug, @product.slug)
关键是要处理的控制器蛞蝓。
您可以通过路由助手传递任何值(没有验证)。不同之处在于你如何在控制器管理传递的数据:
# app/controllers/products_controller.rb
class ProductsController < ApplicationController
def show
@product = Product.find params[:id] #-> FriendlyID will automatically look up the slug if present
end
end
能否请你告诉你的路线文件你如何使用资源? – punitcse