我有一个我认为应该有效的路由设置,但却给了我以下路由错误:
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.rb
我get '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
) ...但当然,我失去我在其他地方使用的资源丰富的路由。请帮忙!
答案 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
不存在;这阻止了它匹配@order
:order GET /orders/:id(.:format) orders#show
的资源丰富的展示路线并导致错误。 我通过将link_to order_path(@order) if @order
更改为link_to order_path(@order) if @order.id
来修复此问题。