在我的情况下,我曾经为了完全古怪的路线而奋斗.rb。我试图在我的rails应用程序中实现Carmen gem。我跟着这个tutorial。我只想要两个相关的选择框,其中第一个是Country,第二个是Region(在这种情况下是子区域)。我花了差不多两个小时才发现,为什么它不起作用。最后,解决方案非常简单 - 只需在routes.rb中切换两行。现在我的问题。我可以请任何人解释为什么,在第一种情况下,是服务器错误的响应以及我的rails应用程序试图在show action上发送请求的原因?我真的不明白。谢谢。
错误:
Routes.rb
resources :orders
get '/orders/subregion_options' => 'orders#subregion_options'
Server output
Started GET "/orders/subregion_options?parent_region=US" for 127.0.0.1 at 2012-08-13 23:18:35 -0700
Processing by OrdersController#show as HTML
Parameters: {"parent_region"=>"US", "id"=>"subregion_options"}
Order Load (1.3ms) SELECT "orders".* FROM "orders" WHERE "orders"."id" = $1 LIMIT 1 [["id", "subregion_options"]]
Completed 500 Internal Server Error in 3ms
ActiveRecord::RecordNotFound (Couldn't find Order with id=subregion_options):
app/controllers/orders_controller.rb:26:in `show'
正确行为:
Routes.rb
get '/orders/subregion_options' => 'orders#subregion_options'
resources :orders
Server output
Started GET "/orders/subregion_options?parent_region=US" for 127.0.0.1 at 2012-08-13 23:20:10 -0700
Processing by OrdersController#subregion_options as HTML
Parameters: {"parent_region"=>"US"}
Rendered orders/_subregion_select.html.erb (3.0ms)
Completed 200 OK in 5ms (Views: 4.6ms | ActiveRecord: 0.0ms)
答案 0 :(得分:1)
原因是routes.rb
中的路线按照它们出现的顺序定义。当您编写resources :orders
时,您隐式创建了一个与GET /orders/:id
控制器上的show
操作匹配的路由,因此当您转到orders
rails时将/orders/subregion_options
解释为subregion_options
,因此错误。
在第二个版本中,您更改了顺序,因此{<1}}在定义资源路径之前与id
操作正确匹配。这就是为什么第二个版本有效,第一个版本没有。
顺便提一下,这是一种更清晰的定义路线的方法:
/orders/subregion_options