Ruby Rails ajax DELETE 请求未到达后端

Ruby on Rails ajax DELETE request is not reaching backend

我有一个 ajax 请求没有到达我的后端函数。该请求的状态为 200 并进入成功阶段,但它从未触发我的后端控制器方法。在我的回复中,我得到了这个:

Turbolinks.clearCache() Turbolinks.visit("http://localhost:3000/session/new", {"action":"replace"})

我的开发控制台没有收到任何错误。关于如何解决这个问题有什么想法吗?

Rails版本为6,Turbolinks版本为5.0.1

这是我在 routes.rb 文件中的路线

  resources :analyses_groups, :controller => "analyses/groups" do
    delete "remove_mitigation_mapping", on: :collection;
    post "add_mitigation_mapping", on: :collection;
  end
 

我的 ajax 调用在我的 index.html.erb 文件中

    $(document).ready(function() {
    
      $("button.delete_mapping_item").on('click', removeMapping);

    });
    
    var removeMapping = function (event) {
              event.stopPropagation();
            
              var button        = $(this);
              var mapping_type  = button.data("mapping_type");
              var mapping_index = button.data("mapping_index");
              var mapping_name  = button.parents("span").text();
            
              if (confirm("Are you sure you want to remove " + mapping_name + "from " + mapping_type + "?")) {
                $("#shade").show();
            
                // Get mitigation_matrix_id
                var row                  = $(this).parents("tr").parents("tr")[0]
                var mitigation_matrix_id = $(row).find(".mitigation_matrix_id").text()
            
                // Set up params for URL
                var param_hash = {
                  "mitigation_matrix_id": mitigation_matrix_id,
                  "mapping_type": mapping_type,
                  "mapping_index": mapping_index,
                }
            
                $.ajax({
                    url: "/analyses_groups/remove_mitigation_mapping" + '?' + $.param(param_hash),
                    type: "DELETE",
                    success: function(data) {
                        console.log("success");
                        console.log(data);
                      button.closest("tr").remove();
                      $("#shade").hide();
                    },
                    error: function(data) {
                      $("#shade").hide();
                    }
                });
              }
            }

我发现这种 ajax 由于 Rail 的身份验证令牌和其他几个需要正确处理才能使其正常工作的问题难以解决,因此很难正确处理。

我通常发现 faster/easier 只是添加一个带有隐藏提交按钮的隐藏表单。稍微混乱一些,但要让它正常工作所需的事情要少得多,所以我通常在原型设计期间以及第一次需要它正常工作时使用它。

基本上只需添加一个 display:none 表单,其中包含 mitigation_matrix_id、mapping_type 和 mapping_index 的隐藏字段。通过JS设置,然后用JS点击隐藏的提交按钮。对于 JS 响应,您可以只使用设置一个 action.js.erb 文件来处理它。该表单应该是 ajax 表单,因此请使用 remote: true, local: false(这适用于各种 rails 应用程序,但严格来说,对于给定版本的 rails).

注意:还有一个专门的 Rails.ajax 方法也可以使用,但是您还需要处理一些事情才能正常工作。

In my response I get this:

Turbolinks.clearCache() >Turbolinks.visit("http://localhost:3000/session/new", {"action":"replace"})

从上面的观察来看,TurboLinks 似乎正在拦截您的请求并尝试在响应中做它的事情,

来自您发布的 ajax 电话,

success: function(data) {
    console.log("success");
    console.log(data);
    button.closest("tr").remove();
    $("#shade").hide();
 },

我可以放心地猜测您正在期待 json 回复,

以下是您可以尝试的方法,

将ajax选项中的dataType字段添加为json,如下:

$.ajax({
  url: "/analyses_groups/remove_mitigation_mapping" + '?' + $.param(param_hash),
  type: "DELETE",
  dataType: 'json',//added the expected response type
  success: function(data) {
    console.log("success");
    console.log(data);
    button.closest("tr").remove();
    $("#shade").hide();
  },
  error: function(data) {
    $("#shade").hide();
  }
});

此外,在控制器代码中,如果您没有,请使用 json 响应并不要使用 redirect_to,或者不要使用 html 或 js 文件进行响应。