Rails 3 - 嵌套资源 - 路由

时间:2010-12-09 19:47:05

标签: ruby-on-rails ruby routing nested

我在嵌套源Product上遇到了与destroy方法有关的问题,它与Orders绑定。

尝试销毁某个项目后,我将用户重定向到我的order_products_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而没有问题。我不明白为什么它在那里工作但不在这里。

由于

3 个答案:

答案 0 :(得分:8)

order_products_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中添加了一篇关于路由的文章链接,其中包含可下载的代码示例。我在一个解释命名路线的段落中更新了它,在“你应该知道的事情”部分:

Routing in Ruby on Rails 3

答案 1 :(得分:3)

您是否需要重定向到order_products_url(@order)?

答案 2 :(得分:1)

你应该使用orer_products_path(而不是url)。如果您转到应用的根目录并输入,

rake routes

将为您提供所有已命名路线的列表。您需要将_path附加到它们(返回字符串表示)。这是一个方便的小技巧,可以找出命名的路线。

现在回答你真正的问题 - 当然它不存在!你刚删除它!您正在销毁产品而不是订单中的产品!