这样做:
#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
这不会对您的路线产生任何影响(它位于您的模型中)——它基本上允许您使用 slugs 来识别您的资源(而不是 id 的)。
如果您想了解更多信息,我可以更新答案;基本上它会允许你有这样的网址:
url.com/:category_id/:product_id/:item
url.com/category-name/product-name/item-name
友好 ID
Friendly ID 只是用slug 参数替换了你的路由/find 方法的: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)。
通过为每个值传递 objects,“裸”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)
诀窍是处理控制器中的 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