rails不区分嵌套在相同名称空间中的两个资源

nr7wwzry  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(228)

我有两种类型的产品嵌套在相同的类别下。我设置的路线是

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_to "View Product Page", [product.collection, product.category, product.subcategory, product], class: 'product__link' %>

这导致了类似于以下url的内容 friendly_id 结束了
/洁面乳/洗面乳和洁面乳/瑕疵治疗痤疮治疗凝胶洁面乳
问题是,该链接只适用于amazon_产品,我不确定如何区分这两种产品。我认为问题在于我引用路径的方式,因为当我在控制台中输入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

我尝试使用链接专门引用其他产品路径

category_subcategory_other_product_path(product.category, product.subcategory, product)

但它给了我一个activerecord::recordnotfound,因为它仍然在错误的控制器中查找

app/controllers/amazon_products_controller.rb:5:in `show'

我如何告诉rails区分这两种资源?

kh212irz

kh212irz1#

简而言之,rails路由是相对简单的模式,它匹配URI并将请求分派给适当的控制器/方法。
如果已以嵌套管线的基本形式指定嵌套管线:

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 所以它是第一;它的控制器将始终被调用。
注意:使用友好的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>

相关问题