Ruby on rails Rails 3-嵌套资源-路由

Ruby on rails Rails 3-嵌套资源-路由,ruby-on-rails,ruby,routing,nested,Ruby On Rails,Ruby,Routing,Nested,我对绑定到订单的嵌套源产品的销毁方法有问题 尝试销毁项目后,我将用户重定向到我的订单产品url。我收到以下路由错误: No route matches "/orders/1/products" 我的销毁方法如下所示: def destroy @product = Product.find(params[:id]) @order = Order.find(params[:order_id]) @product.destroy respond_to do |for

我对绑定到订单的嵌套源产品的销毁方法有问题

尝试销毁项目后,我将用户重定向到我的订单产品url。我收到以下路由错误:

No route matches "/orders/1/products"
我的销毁方法如下所示:

def destroy
    @product = Product.find(params[:id])
    @order = Order.find(params[:order_id])
    @product.destroy

    respond_to do |format|
      format.html { redirect_to(order_products_url) }
      format.xml  { head :ok }
    end
end
在routes.rb中:

resources :orders do
    resources :products, :controller => "products"    
  end
这让我感到困惑的原因是,对于我的产品更新方法,我正确地将用户重定向到order_products_url而没有问题。我不明白为什么它在那里有效,但在这里无效


谢谢

您不需要重定向到order\u products\u url(@order)?

您应该使用orer\u products\u路径(而不是url)。如果您转到应用程序的根目录并键入

rake routes
这将为您提供所有命名路由的列表。但是,您需要将_path附加到它们(返回字符串表示形式)。这是一个计算命名路由的简便小技巧


现在谈谈你真正的问题——它当然不存在!你刚刚删除了它!您正在销毁产品,而不是订单中的产品

order\u products\u url
需要传递一个参数-订单id或订单对象本身。没有这个,它就不能正常工作。因此,使用上面的代码:

def destroy
    @product = Product.find(params[:id])
    @order = Order.find(params[:order_id])
    @product.destroy

    respond_to do |format|
      format.html { redirect_to(order_products_url(@order) }
      format.xml  { head :ok }
    end
end
作为旁注,您可以稍微缩短路线:

resources :orders do
  resources :products
end
当控制器命名为Rails时,指定控制器是多余的。我希望这有帮助

更新:我在关于Rails 3中路由的文章中添加了一个链接,其中包含可下载的代码示例。我在“你应该知道的事情”一节中更新了一段解释命名路线的内容:


这两个后缀(\u path和\u url)在本例中都起作用,是缺少的参数导致了问题。嘿,Seth,谢谢你的帮助。rake routes非常有助于我解决另一个问题,我发现我的问题是没有通过辩论(doh)。在测试中,我尝试使用了_path和_url-两者都有效。我只是好奇这两者之间有什么区别?\u路径是相对的,\u url是绝对甜蜜的,谢谢你的帮助。更正后,我发现我的视图有一个问题,我现在在我的order\u product\u路径上使用delete方法更正了它,而不是在我试图删除@product之前。我很感激你的帮助,我真的很感激。我很高兴你的帮助!如果你想要更多的信息,我添加了一个链接到我不久前写的一篇博文。祝你好运另外值得注意的是,您在重定向路由中包括@order--order_products_url(@order)--因为您需要告诉Rails您要显示哪个特定的产品索引(即嵌套在该特定顺序下的产品索引,而不是其他顺序)。