在非资源路由中路由错误“无路由匹配”

时间:2015-08-07 15:55:14

标签: ruby-on-rails ruby-on-rails-3 routing routes

我有一个我认为应该有效的路由设置,但却给了我以下路由错误:

No route matches {
  :action=>"show", :controller=>"orders", 
  :id=>#<Order id: nil, 
    user_id: nil, 
    paid: nil, 
    created_at: nil, 
    updated_at: nil, 
    trip_id: nil
  >
}

我使用的是Rails版本3.2.13。

routes.rbget 'orders/new/:trip_id' => 'orders#new', :as => :new_order。这是在resources :orders中的routes.rb之前。

在视图中,我有<%= link_to 'Click here to register for this trip.', new_order_path(@trip.id) %>。在@trip.id = 1<a href="/orders/new/1">Click here to register for this trip.</a>的情况下,这会产生以下(似乎是正确的)HTML。

当我运行rake:routes时,此行(看似正确)就是生成的行之一:new_order GET /orders/new/:trip_id(.:format) orders#new

来自rake:routes的其他与订单相关的路由 orders GET /orders(.:format) orders#index POST /orders(.:format) orders#create GET /orders/new(.:format) orders#new edit_order GET /orders/:id/edit(.:format) orders#edit order GET /orders/:id(.:format) orders#show PUT /orders/:id(.:format) orders#update DELETE /orders/:id(.:format) orders#destroy

orders_controller.rb中,以下行显示为新方法的第一行:@trip = Trip.find(params[:trip_id])

在我尝试Rails.application.routes.recognize_path "/orders/new/1"的控制台中,我得到=> {:controller=>"orders", :action=>"new", :trip_id=>"1"},这似乎是正确的。太令人沮丧了。

我无法弄清楚为什么当我点击链接时,我会在第一段中看到上面显示的路由错误。 有意思的是,当我在resources :orders中发表评论routes.rb时,会发送预定的操作(即OrdersController.new ...但当然,我失去我在其他地方使用的资源丰富的路由。请帮忙!

2 个答案:

答案 0 :(得分:0)

您无法添加此类路线

get 'orders/new/:trip_id' => 'orders#new', :as => :new_order

Rails会将此理解为显示路径 而是像这样添加

get 'orders/:trip_id/new/' => 'orders#new', :as => :new_order

答案 1 :(得分:0)

最后,我最终自己解决了这个问题,并且对于之前没有看到它感到有些愚蠢。我忘记了我引入了有问题的视图使用的新布局。此布局包括link_to order_path(@order) if @order。事实上,这就是造成错误的一条线。 @order已存在,但尚未保留,因此@order.id不存在;这阻止了它匹配@orderorder GET /orders/:id(.:format) orders#show的资源丰富的展示路线并导致错误。 我通过将link_to order_path(@order) if @order更改为link_to order_path(@order) if @order.id来修复此问题。