如何使用ajax请求删除laravel 5.3中的记录?

Aya*_*hah 11 php ajax laravel laravel-5

我正在尝试使用laravel 5.3中的ajax删除记录,我知道这是一个常见的问题,并且已经有很多关于此主题的在线解决方案和教程.我尝试了其中一些,但大多数给了我同样的错误NetworkError: 405 Method Not Allowed.我尝试以不同的角度完成这项任务,但我陷入困境,无法找到我错的地方,这就是为什么我将这个问题添加到指南中.

我正在尝试使用脚本来删除记录.

Controller.php这样

public function destroy($id)
{   //For Deleting Users
    $Users = new UserModel;
    $Users = UserModel::find($id);
    $Users->delete($id);
    return response()->json([
        'success' => 'Record has been deleted successfully!'
    ]);
}
Run Code Online (Sandbox Code Playgroud)

routes.php文件

Route::get('/user/delete/{id}', 'UserController@destroy');
Run Code Online (Sandbox Code Playgroud)

在视图中

<button class="deleteProduct" data-id="{{ $user->id }}" data-token="{{ csrf_token() }}" >Delete Task</button>
Run Code Online (Sandbox Code Playgroud)

App.js

$(".deleteProduct").click(function(){
        var id = $(this).data("id");
        var token = $(this).data("token");
        $.ajax(
        {
            url: "user/delete/"+id,
            type: 'PUT',
            dataType: "JSON",
            data: {
                "id": id,
                "_method": 'DELETE',
                "_token": token,
            },
            success: function ()
            {
                console.log("it Work");
            }
        });

        console.log("It failed");
    });
Run Code Online (Sandbox Code Playgroud)

当我点击删除按钮时,它NetworkError: 405 Method Not Allowed在控制台中返回错误.没有ajax相同的删除功能正常工作.

任何人都可以指导我,我错了,我可以解决这个问题,我想感谢有人指导我这个.谢谢..

sia*_*one 18

而不是Route::get使用Route::delete.

除了更改ajax调用中的type: 'Put'to之外type: 'DELETE'.


PS这段代码

$Users = new UserModel;        // Totally useless line
$Users = UserModel::find($id); // Can chain this line with the next one
$Users->delete($id);
Run Code Online (Sandbox Code Playgroud)

可以写成:

UserModel::find($id)->delete();
Run Code Online (Sandbox Code Playgroud)

甚至更短:

UserModel::destroy($id);
Run Code Online (Sandbox Code Playgroud)

请记住,这->delete()将触发事件而::destroy()不会.


Kou*_*Das 14

确保将此meta添加到您的视图标签中

    <meta name="csrf-token" content="{{ csrf_token() }}">
Run Code Online (Sandbox Code Playgroud)

在您的Routes, 执行此操作

Route::delete('/user/delete/{id}', 'UserController@destroy');
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,执行此操作

UserModel::destroy($id);
Run Code Online (Sandbox Code Playgroud)

或者

DB::table('table_name')->where('id', $id)->delete();
Run Code Online (Sandbox Code Playgroud)

确保检查删除帐户的用户实际上拥有该帐户,即运行授权测试。

由于这是一个delete请求,因此您需要csrf_token按照官方网站的说明将与 ajax 标头一起发送。 https://laravel.com/docs/5.5/csrf#csrf-x-csrf-token

确保在 ajax 调用之前添加

$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
});
Run Code Online (Sandbox Code Playgroud)

现在发送请求

$(".deleteProduct").click(function(){
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    $.ajax(
    {
        url: "user/delete/"+id,
        type: 'delete', // replaced from put
        dataType: "JSON",
        data: {
            "id": id // method and token not needed in data
        },
        success: function (response)
        {
            console.log(response); // see the reponse sent
        },
        error: function(xhr) {
         console.log(xhr.responseText); // this line will save you tons of hours while debugging
        // do something here because of error
       }
    });
});
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。