【问题标题】:405 (Method Not Allowed) error on a DELETE Ajax Request in LaravelLaravel 中的 DELETE Ajax 请求出现 405(不允许的方法)错误
【发布时间】:2017-10-01 10:17:26
【问题描述】:

我知道有几篇关于使用 AJAX 删除的 405 错误的帖子。但是,我发现的帖子中没有一个解决方案对我有用。

我有一个表格视图,其中显示了我的数据库表格中的所有产品。在每一行都有一个删除按钮来删除产品,如下所示:

{!! Form::open(['method' => 'DELETE', 'route' => ['slider.destroy', $slide->id]]) !!}
    <button type="button" class="deleteproductModal btn btn-xs btn-default btn-flat"
            data-toggle="modal"
            data-product_token="{{ csrf_token() }}"
            data-product_name="{{ $slide->title_slider }}"
            data-product_destroy_route="{{ route('slider.destroy', $slide->id) }}">
        <i class="fa fa-trash"></i>
    </button>
{!! Form::close() !!}

点击按钮后,以下 javascript 执行,调用控制器中的 destroy 方法从数据库中删除产品:

$('button.deleteproductModal').click(function()
{
    var productRoute = $(this).attr("data-product_destroy_route");
    var productName = $(this).attr("data-product_name");
    var productToken = $(this).attr("data-product_token");
    deleteproduct(productRoute, productToken, productName);
});

function deleteproduct(productRoute, productToken, productName)
{
    swal({
        title: "Window product Deletion",
        text: "Are you absolutely sure you want to delete " + productName + "? This action cannot be undone." +
        "This will permanently delete " + productName + ", and remove all collections and materials associations.",
        type: "warning",
        showCancelButton: true,
        closeOnConfirm: false,
        confirmButtonText: "Delete " + productName,
        confirmButtonColor: "#ec6c62"
    }, function()
    {
        $.ajax({
            type: "DELETE",
            url: productRoute,
            headers: { 'X-CSRF-TOKEN' : productToken }
        })
            .done(function(data)
        {
            swal("Window Product Deleted!", productName + " Window Product was successfully delete.", "success");
        })

            .error(function(data)
        {
            swal("Oops", "We couldn't connect to the server!", "error");
        });

    });
}

我的控制器是一个资源控制器。路线如下:

Route::resource('slider','Backend\SliderController');

这是被调用的控制器的销毁方法。

public function destroy($id)
{
    $home= Slider::find($id);

    unlink($home->featured_image);

    $home->delete();
    notify()->flash('<h3>Deleted successfully</h3>', 'success', ['timer'=>2000]);
    return redirect('slider');

}

当我删除产品时,我得到了糟糕的提示,我们无法连接到服务器甜蜜警报错误,但是当我刷新页面时,数据被删除....有什么帮助吗?

【问题讨论】:

  • 不确定,但您确定表单本身在运行任何 javascript 之前不会提交吗?我在按钮中没有看到任何类型的提交......所以它可能不会。无论如何,那里有很多东西=/如果您要使用 ajax 请求,我认为您甚至不需要打开和关闭表单。
  • 首先,您不需要为每个按钮创建一个表单。为所有按钮制作一个表单,或者只是删除表单并将令牌添加到您的页面。其次,您必须弄清楚您的 ajax 是正在触发还是现在才提交。如果您的 ajax 正在触发,您的 php 代码中可能有错误。在谷歌浏览器中,您可以在开发者控制台中查看请求数据。如果您提供更多信息,我们可能会为您提供更多有用的数据作为回报。

标签: ajax laravel sweetalert


【解决方案1】:

您必须设置 ajax 类型 POST 但发送一个名为 _method 的参数,其值为 delete,如下所示:

$.ajax({
        type: "POST",
        data:{
         _method:"DELETE"
        },
        url: productRoute,
        headers: { 'X-CSRF-TOKEN' : productToken }
    });

或者因为您使用 laravel html 表单助手,所以它会自动生成 _method 隐藏输入,因此您最好发送所有表单输入,例如令牌和方法,如下所示:

 function()
{

    var formData=$('#yourForm').serialize();
    $.ajax({
        type: "POST",
        url: productRoute,
        data:formData
    })
      .
      . 

});

【讨论】:

  • 在此之后,您必须使用您的 jquery 技能。例如,您想在 ajax 请求后立即删除一个项目,以便您可以将项目的 id 提供给要删除的 html 元素,另一方面将此 id 提供给这样的表单“data-to-remove=”#23 ’”。现在在 ajax 成功函数中你可以这样做: $($("#yourForm").data('to-remove')).hide();
猜你喜欢
  • 2017-09-03
  • 2020-03-19
  • 2017-10-05
  • 2019-03-25
  • 2012-11-29
  • 2018-03-07
  • 2016-04-27
  • 2015-03-24
  • 2018-02-28
相关资源
最近更新 更多