【问题标题】:Rails 3 - Nested Resources - RoutingRails 3 - 嵌套资源 - 路由
【发布时间】:2011-05-23 02:11:49
【问题描述】:

我在与订单绑定的嵌套源产品上的销毁方法存在问题。

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

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby routing nested


    【解决方案1】:

    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

    【讨论】:

    • 亲爱的,谢谢你的帮助。更正此问题后,我发现我的视图存在问题,现在我已将其更正为在我的 order_product_path 上使用删除方法的位置,而不是在我试图仅删除我的@product 之前。感谢您的帮助,我真的很感激。
    • 我很高兴它有帮助!如果您想了解更多信息,我添加了一个链接,指向我不久前写的一篇博客文章。祝你好运!
    • 另外需要注意的是你在重定向路由中包含@order -- order_products_url(@order) -- 因为你需要告诉Rails你想要显示哪个特定的产品索引(即产品嵌套在该特定订单下,而不是其他订单)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您应该使用 orer_products_path(不是 url)。如果您转到应用程序的根目录并键入,

      rake routes
      

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

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

      【讨论】:

      • 两个后缀(_path 和 _url)在这种情况下都有效,这是导致问题的缺失参数。
      • 嘿赛斯,感谢您的帮助。一旦我发现我的问题不是通过争论(doh),rake 路线非常有助于我解决我创建的另一个问题。对于测试,我尝试同时使用 _path 和 _url - 两者都有效。我只是好奇这两者有什么区别?
      • _path 是相对的,_url 是绝对的 stackoverflow.com/questions/2350539/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多