"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 操作是 POSTorders_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时,它会命中OrdersControllercreate方法。你仍然可以命中这种方法也可以通过 POSTing 到 /po/orders(正如我在上面推荐的那样)。