2010-12-09 239 views
3

我遇到的问题与我的销毁方法在嵌套的源产品,这是绑定到订单。Rails 3 - 嵌套的资源 - 路由

试图摧毁一件物品后,我将用户重定向到我的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而没有问题。我不明白为什么它在那里工作,但不在这里。

感谢

回答

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

3

不要你需要重定向到order_products_url(@order)?

1

你应该使用orer_products_path(不是url)。如果你去你的应用程序的根和键入,

rake routes 

这将给你一个所有命名路线的列表。你需要追加_path给他们虽然(返回字符串表示)。这是计算命名路线的一个方便的小技巧。

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

+0

两个后缀(_path和_url)在这种情况下工作,这是导致该问题的缺少的参数。奇怪的是 – 2010-12-09 19:56:01

+0

。 _url根本不适合我(只是试过) – sethvargo 2010-12-09 20:01:40