Rails 不区分嵌套在同一命名空间中的两个资源
Rails not differentiating between two resources nested in the same namespaces
我有两种嵌套在同一类别下的产品。我设置的路线是
resources :categories, path: '/', only: [:show] do
resources :subcategories, path: '/', only: [:show] do
resources :amazon_products, path: '/', only: [:show]
resources :other_products, path: '/', only: [:show]
end
end
我之前使用此 link
访问的
<%= link_to "View Product Page", [product.collection, product.category, product.subcategory, product], class: 'product__link' %>
在 friendly_id
完成后 url
/cleansers/face-wash-and-cleansers/blemish-remedy-acne-treatment-gelee-cleanser
问题是 link 仅解析 amazon_products,我不确定如何区分两者。我认为问题出在我引用路径的方式上,因为当我在控制台中输入 rails 路由时,我可以看到那里的两条不同路径
category_subcategory_amazon_product
GET :category_id/:subcategory_id/:id(.:format)
amazon_products#show
category_subcategory_other_product
GET /:collection_id/:category_id/:subcategory_id/:id(.:format)
other_products#show
我尝试使用 link
专门引用其他产品路径
category_subcategory_other_product_path(product.category, product.subcategory, product)
但它给了我一个 ActiveRecord::RecordNotFound,因为它仍在寻找错误的控制器
app/controllers/amazon_products_controller.rb:5:in `show'
如何让 rails 区分这两种资源?
归根结底,Rails 路由是相对简单的模式,可以匹配 URI 并将请求分派到正确的 controller/method。
如果您以基本形式指定了嵌套路由:
resources :categories, only: [:show] do
resources :subcategories, only: [:show] do
resources :amazon_products, only: [:show]
resources :other_products, only: [:show]
end
end
产品级别的结果 URI 模式如下所示:
/categories/<id>/subcategories/<id>/amazon_products/<id>
/categories/<id>/subcategories/<id>/other_products/<id>
诚然冗长,但明显不同的模式。
问题是您在资源上使用 path: '/'
来删除资源路由的所有独特之处。因此,您的产品级路由模式是:
category_subcategory_amazon_product: /<id>/<id>/<id>
category_subcategory_other_product: /<id>/<id>/<id>
由于这两个模式是相同的,Rails 回到了匹配第一个定义的历史悠久的做法。您可以通过交换 :other_products
来证明它是第一个;然后它的控制器将始终被调用。
注意:您使用的是 friendly-id 无关紧要——这只会改变 ID 对用户的外观,而不是基本路由模式。
解决方案是简单地重新引入一些独特性,至少在产品级别。
resources :categories, path: '/', only: [:show] do
resources :subcategories, path: '/', only: [:show] do
resources :amazon_products, path: 'amazon', only: [:show]
resources :other_products, path: 'other', only: [:show]
end
end
结果将是 Rails 实际可以区分的路由模式:
category_subcategory_amazon_product: /<id>/<id>/amazon/<id>
category_subcategory_other_product: /<id>/<id>/other/<id>
我有两种嵌套在同一类别下的产品。我设置的路线是
resources :categories, path: '/', only: [:show] do
resources :subcategories, path: '/', only: [:show] do
resources :amazon_products, path: '/', only: [:show]
resources :other_products, path: '/', only: [:show]
end
end
我之前使用此 link
访问的<%= link_to "View Product Page", [product.collection, product.category, product.subcategory, product], class: 'product__link' %>
在 friendly_id
完成后 url
/cleansers/face-wash-and-cleansers/blemish-remedy-acne-treatment-gelee-cleanser
问题是 link 仅解析 amazon_products,我不确定如何区分两者。我认为问题出在我引用路径的方式上,因为当我在控制台中输入 rails 路由时,我可以看到那里的两条不同路径
category_subcategory_amazon_product
GET :category_id/:subcategory_id/:id(.:format)
amazon_products#show
category_subcategory_other_product
GET /:collection_id/:category_id/:subcategory_id/:id(.:format)
other_products#show
我尝试使用 link
专门引用其他产品路径category_subcategory_other_product_path(product.category, product.subcategory, product)
但它给了我一个 ActiveRecord::RecordNotFound,因为它仍在寻找错误的控制器
app/controllers/amazon_products_controller.rb:5:in `show'
如何让 rails 区分这两种资源?
归根结底,Rails 路由是相对简单的模式,可以匹配 URI 并将请求分派到正确的 controller/method。
如果您以基本形式指定了嵌套路由:
resources :categories, only: [:show] do
resources :subcategories, only: [:show] do
resources :amazon_products, only: [:show]
resources :other_products, only: [:show]
end
end
产品级别的结果 URI 模式如下所示:
/categories/<id>/subcategories/<id>/amazon_products/<id>
/categories/<id>/subcategories/<id>/other_products/<id>
诚然冗长,但明显不同的模式。
问题是您在资源上使用 path: '/'
来删除资源路由的所有独特之处。因此,您的产品级路由模式是:
category_subcategory_amazon_product: /<id>/<id>/<id>
category_subcategory_other_product: /<id>/<id>/<id>
由于这两个模式是相同的,Rails 回到了匹配第一个定义的历史悠久的做法。您可以通过交换 :other_products
来证明它是第一个;然后它的控制器将始终被调用。
注意:您使用的是 friendly-id 无关紧要——这只会改变 ID 对用户的外观,而不是基本路由模式。
解决方案是简单地重新引入一些独特性,至少在产品级别。
resources :categories, path: '/', only: [:show] do
resources :subcategories, path: '/', only: [:show] do
resources :amazon_products, path: 'amazon', only: [:show]
resources :other_products, path: 'other', only: [:show]
end
end
结果将是 Rails 实际可以区分的路由模式:
category_subcategory_amazon_product: /<id>/<id>/amazon/<id>
category_subcategory_other_product: /<id>/<id>/other/<id>