Rails嵌套资源配置后products无index路由、创建产品跳转报错
问题根因
你遇到的路由异常是路由配置语法错误导致的:Rails 中单数resource用于声明单资源(即对应模型全局仅存在1条记录的场景),不会生成index路由,也不会在路径规则中注入:id参数,完全不符合你当前一对多嵌套资源的需求。
你配置的resource :products会让/product_categories/:product_category_id/products直接映射到products#show动作,且该动作不需要传递产品ID,和你控制器中需要params[:id]查询产品的逻辑冲突,就会触发「无法查询无ID的Product」报错。
修复步骤
- 修改
config/routes.rb配置,将嵌套的单数resource改为复数resources
Rails.application.routes.draw do root 'product_categories#index' resources :product_categories do resources :products # 此处修改为复数 end end
修改后执行rails routes验证,会生成标准的嵌套产品路由:
/product_categories/:product_category_id/products映射到products#index/product_categories/:product_category_id/products/:id映射到products#show等单产品动作
- 修正
ProductsController中的跳转逻辑,所有产品相关路由都需要携带父级分类参数:
- 创建产品成功后如果要跳转到产品详情页,将跳转路径改为
product_category_product_path(@product_category, @product) - 更新产品成功后的跳转路径同样改为
product_category_product_path(@product_category, @product) - 删除产品成功后的跳转路径改为
product_category_products_path(@product_category)
- 同步修正所有视图文件中产品相关的路径引用,统一使用嵌套路由格式,避免后续报错。
内容的提问来源于stack exchange,提问作者Patrick Vellia
相关产品推荐
相关产品推荐

