使用AJAX调用的奇怪行为路由

时间:2012-08-14 06:46:07

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

在我的情况下,我曾经为了完全古怪的路线而奋斗.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)

1 个答案:

答案 0 :(得分:1)

原因是routes.rb中的路线按照它们出现的顺序定义。当您编写resources :orders时,您隐式创建了一个与GET /orders/:id控制器上的show操作匹配的路由,因此当您转到orders rails时将/orders/subregion_options解释为subregion_options,因此错误。

在第二个版本中,您更改了顺序,因此{<1}}在定义资源路径之前与id操作正确匹配。这就是为什么第二个版本有效,第一个版本没有。

顺便提一下,这是一种更清晰的定义路线的方法:

/orders/subregion_options