"NetworkError: 404 Not Found" - $.post() with jQuery
"NetworkError: 404 Not Found" - $.post() with jQuery
这是我们的 Rails 3.2 应用程序中的 js 代码,用于响应 ID 以 'order_order_items_attributes' 开头的字段的更改:
$(function (){
$(document).on('change', "[id^='order_order_items_attributes'][id$='_name']", function (){
$.post(window.location, $('form').serialize(), null, "script");
return false;
});
});
$.post() 导致错误:
"NetworkError: 404 Not Found - http://localhost:3000/po/orders/new?parent_record_id=4&parent_resource=ext_construction_projectx%2Fprojects&project_id=4%22"
这是 window.location
:
如果我们用 $.get() 替换 $.post(),那么代码可以正常工作并在服务器上启动 ajax 响应:
$.get(window.location, $('form').serialize(), null, "script"); #works!
但是我们必须使用 $.post() 因为大量的数据被 posted 到服务器。 jquery 文档显示 $.get() 和 $.post() 具有完全相同的格式。我们在这里错过了 $.post()?
更新
rake 路由输出:
Routes for PurchaseOrderx::Engine:
search_order_items GET /order_items/search(.:format) purchase_orderx/order_items#search
search_results_order_items GET /order_items/search_results(.:format) purchase_orderx/order_items#search_results
stats_order_items GET /order_items/stats(.:format) purchase_orderx/order_items#stats
stats_results_order_items GET /order_items/stats_results(.:format) purchase_orderx/order_items#stats_results
order_items GET /order_items(.:format) purchase_orderx/order_items#index
POST /order_items(.:format) purchase_orderx/order_items#create
new_order_item GET /order_items/new(.:format) purchase_orderx/order_items#new
edit_order_item GET /order_items/:id/edit(.:format) purchase_orderx/order_items#edit
order_item GET /order_items/:id(.:format) purchase_orderx/order_items#show
PUT /order_items/:id(.:format) purchase_orderx/order_items#update
DELETE /order_items/:id(.:format) purchase_orderx/order_items#destroy
search_orders GET /orders/search(.:format) purchase_orderx/orders#search
search_results_orders GET /orders/search_results(.:format) purchase_orderx/orders#search_results
stats_orders GET /orders/stats(.:format) purchase_orderx/orders#stats
stats_results_orders GET /orders/stats_results(.:format) purchase_orderx/orders#stats_results
event_action_order GET /orders/:id/event_action(.:format) purchase_orderx/orders#event_action
acct_approve_order PUT /orders/:id/acct_approve(.:format) purchase_orderx/orders#acct_approve
acct_reject_order PUT /orders/:id/acct_reject(.:format) purchase_orderx/orders#acct_reject
gm_approve_order PUT /orders/:id/gm_approve(.:format) purchase_orderx/orders#gm_approve
gm_reject_order PUT /orders/:id/gm_reject(.:format) purchase_orderx/orders#gm_reject
gm_rewind_order PUT /orders/:id/gm_rewind(.:format) purchase_orderx/orders#gm_rewind
submit_order PUT /orders/:id/submit(.:format) purchase_orderx/orders#submit
list_open_process_orders GET /orders/list_open_process(.:format) purchase_orderx/orders#list_open_process
orders GET /orders(.:format) purchase_orderx/orders#index
POST /orders(.:format) purchase_orderx/orders#create
new_order GET /orders/new(.:format) purchase_orderx/orders#new
edit_order GET /orders/:id/edit(.:format) purchase_orderx/orders#edit
order GET /orders/:id(.:format) purchase_orderx/orders#show
PUT /orders/:id(.:format) purchase_orderx/orders#update
DELETE /orders/:id(.:format) purchase_orderx/orders#destroy
root / purchase_orderx/orders#index
这是采购订单引擎的佣金路由输出。大多数路线与问题无关,仍按原样列出。
这里是routes.rb:
resources :order_items do
collection do
get :search
get :search_results
get :stats
get :stats_results
end
end
resources :orders do
collection do
get :search
get :search_results
get :stats
get :stats_results
end
end
为了便于阅读,routes.rb 中删除了与工作流相关的操作。
当使用 POST HTTP 动词时,您的后端路由没有正确地将 URL 路由到有效的控制器。在终端的 Rails 项目的根目录中,运行 rake routes
查看所有可用的路由,以及它们的最终位置。没有看到你的 routes.rb
我无法准确解释问题所在,但这绝对是后端路由问题。
我不会向 "stick this in routes.rb and it will work" 推荐某些评论所说的内容。你的路线应该得到很好的维护,并使用正确的路线助手来完成这项工作。如果你扔杂项。路由在那里解决问题,你最终会得到一堆意大利面条作为你的路由,并且随着时间的推移,你的应用程序的维护将变得更加困难。
编辑:已更新以引用问题的更新
当前页面 URL 是 /po/orders/new
。查看您的 rake routes
输出,这映射到 new_order_path
,由这一行证明:
new_order GET /orders/new(.:format) purchase_orderx/orders#new
如果直接在上面看,您会看到 create
操作的 真实 路线:
POST /orders(.:format) purchase_orderx/orders#create
此 create
操作是 POST
到 orders_path
,解析为 /po/orders/
。如果你 POST 到这个 URL,一切都应该有效。如果您希望能够 post 到 URL 您当前正在使用并让它工作,只需修改您的 routes.rb
以匹配此:
resources :order_items do
collection do
get :search
get :search_results
get :stats
get :stats_results
end
end
resources :orders do
# Manually route POSTs to /new to the create action
post "/new", :controller => :orders, :action => :create
collection do
get :search
get :search_results
get :stats
get :stats_results
end
end
现在,当你对这个URL(/po/orders/new
做一个POST时,它会命中OrdersController
create
方法。你仍然可以命中这种方法也可以通过 POSTing 到 /po/orders
(正如我在上面推荐的那样)。
这是我们的 Rails 3.2 应用程序中的 js 代码,用于响应 ID 以 'order_order_items_attributes' 开头的字段的更改:
$(function (){
$(document).on('change', "[id^='order_order_items_attributes'][id$='_name']", function (){
$.post(window.location, $('form').serialize(), null, "script");
return false;
});
});
$.post() 导致错误:
"NetworkError: 404 Not Found - http://localhost:3000/po/orders/new?parent_record_id=4&parent_resource=ext_construction_projectx%2Fprojects&project_id=4%22"
这是 window.location
:
如果我们用 $.get() 替换 $.post(),那么代码可以正常工作并在服务器上启动 ajax 响应:
$.get(window.location, $('form').serialize(), null, "script"); #works!
但是我们必须使用 $.post() 因为大量的数据被 posted 到服务器。 jquery 文档显示 $.get() 和 $.post() 具有完全相同的格式。我们在这里错过了 $.post()?
更新
rake 路由输出:
Routes for PurchaseOrderx::Engine:
search_order_items GET /order_items/search(.:format) purchase_orderx/order_items#search
search_results_order_items GET /order_items/search_results(.:format) purchase_orderx/order_items#search_results
stats_order_items GET /order_items/stats(.:format) purchase_orderx/order_items#stats
stats_results_order_items GET /order_items/stats_results(.:format) purchase_orderx/order_items#stats_results
order_items GET /order_items(.:format) purchase_orderx/order_items#index
POST /order_items(.:format) purchase_orderx/order_items#create
new_order_item GET /order_items/new(.:format) purchase_orderx/order_items#new
edit_order_item GET /order_items/:id/edit(.:format) purchase_orderx/order_items#edit
order_item GET /order_items/:id(.:format) purchase_orderx/order_items#show
PUT /order_items/:id(.:format) purchase_orderx/order_items#update
DELETE /order_items/:id(.:format) purchase_orderx/order_items#destroy
search_orders GET /orders/search(.:format) purchase_orderx/orders#search
search_results_orders GET /orders/search_results(.:format) purchase_orderx/orders#search_results
stats_orders GET /orders/stats(.:format) purchase_orderx/orders#stats
stats_results_orders GET /orders/stats_results(.:format) purchase_orderx/orders#stats_results
event_action_order GET /orders/:id/event_action(.:format) purchase_orderx/orders#event_action
acct_approve_order PUT /orders/:id/acct_approve(.:format) purchase_orderx/orders#acct_approve
acct_reject_order PUT /orders/:id/acct_reject(.:format) purchase_orderx/orders#acct_reject
gm_approve_order PUT /orders/:id/gm_approve(.:format) purchase_orderx/orders#gm_approve
gm_reject_order PUT /orders/:id/gm_reject(.:format) purchase_orderx/orders#gm_reject
gm_rewind_order PUT /orders/:id/gm_rewind(.:format) purchase_orderx/orders#gm_rewind
submit_order PUT /orders/:id/submit(.:format) purchase_orderx/orders#submit
list_open_process_orders GET /orders/list_open_process(.:format) purchase_orderx/orders#list_open_process
orders GET /orders(.:format) purchase_orderx/orders#index
POST /orders(.:format) purchase_orderx/orders#create
new_order GET /orders/new(.:format) purchase_orderx/orders#new
edit_order GET /orders/:id/edit(.:format) purchase_orderx/orders#edit
order GET /orders/:id(.:format) purchase_orderx/orders#show
PUT /orders/:id(.:format) purchase_orderx/orders#update
DELETE /orders/:id(.:format) purchase_orderx/orders#destroy
root / purchase_orderx/orders#index
这是采购订单引擎的佣金路由输出。大多数路线与问题无关,仍按原样列出。
这里是routes.rb:
resources :order_items do
collection do
get :search
get :search_results
get :stats
get :stats_results
end
end
resources :orders do
collection do
get :search
get :search_results
get :stats
get :stats_results
end
end
为了便于阅读,routes.rb 中删除了与工作流相关的操作。
当使用 POST HTTP 动词时,您的后端路由没有正确地将 URL 路由到有效的控制器。在终端的 Rails 项目的根目录中,运行 rake routes
查看所有可用的路由,以及它们的最终位置。没有看到你的 routes.rb
我无法准确解释问题所在,但这绝对是后端路由问题。
我不会向 "stick this in routes.rb and it will work" 推荐某些评论所说的内容。你的路线应该得到很好的维护,并使用正确的路线助手来完成这项工作。如果你扔杂项。路由在那里解决问题,你最终会得到一堆意大利面条作为你的路由,并且随着时间的推移,你的应用程序的维护将变得更加困难。
编辑:已更新以引用问题的更新
当前页面 URL 是 /po/orders/new
。查看您的 rake routes
输出,这映射到 new_order_path
,由这一行证明:
new_order GET /orders/new(.:format) purchase_orderx/orders#new
如果直接在上面看,您会看到 create
操作的 真实 路线:
POST /orders(.:format) purchase_orderx/orders#create
此 create
操作是 POST
到 orders_path
,解析为 /po/orders/
。如果你 POST 到这个 URL,一切都应该有效。如果您希望能够 post 到 URL 您当前正在使用并让它工作,只需修改您的 routes.rb
以匹配此:
resources :order_items do
collection do
get :search
get :search_results
get :stats
get :stats_results
end
end
resources :orders do
# Manually route POSTs to /new to the create action
post "/new", :controller => :orders, :action => :create
collection do
get :search
get :search_results
get :stats
get :stats_results
end
end
现在,当你对这个URL(/po/orders/new
做一个POST时,它会命中OrdersController
create
方法。你仍然可以命中这种方法也可以通过 POSTing 到 /po/orders
(正如我在上面推荐的那样)。