如何通过ajax删除laravel中的记录

Nat*_*afa 6 php ajax laravel

我知道还有与此问题相关的类似问题,但我在找到正确答案后尝试了我的副本,但仍然无济于事。我不断收到此错误:

BadMethodCallException 方法删除不存在。在 Macroable.php 中(第 74 行)

为了快速起见,这是我的控制器:

public function destroy(Subject $subject)
{
    //
    $response = array();

    $modal = new Subject; 
    $modal = Subject::find($subject);

    if ( $modal->delete() ) {
        $response['success'] = '<b>'.$modal->name.'</b>'.' successfully deleted';
        $response['subject'] = $modal;   
    }

    return \Response::json($response);

}
Run Code Online (Sandbox Code Playgroud)

这是我的路线:

Route::delete('/subjects/delete/{subject}', 'SubjectsController@destroy');
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

<td>
    <a data-token="{{ csrf_token() }}" id="delete" data-id="{{$subject->id}}" data-toggle="tooltip" title="Edit" href="/subjects/{{$subject->id}}" role="button"><i class="glyphicon glyphicon-trash text-danger"></i></a>
</td>
Run Code Online (Sandbox Code Playgroud)

最后是我的脚本:

$(document).on('click', '#delete', function(event) {
            event.preventDefault();
            /* Act on the event */

            // id of the row to be deleted
            var id = $(this).attr('data-id');

            var token = $(this).data("token");

            console.log(id);

            // row to be deleted
            var row = $(this).parent("td").parent("tr");

            var message = "subject";

             bootbox.dialog({
                message: "Are you sure you want to Delete this "+message+"?",
                title: "<i class='glyphicon glyphicon-trash'></i> Delete !",
                buttons: {
                    success: {
                        label: "No",
                        className: "btn-success",
                        callback: function() {
                            $('.bootbox').modal('hide');
                        }
                    },
                    danger: {
                        label: "Delete!",
                        className: "btn-danger",
                        callback: function() {

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

                            $.ajax({
                                type: 'DELETE',
                                url: '/subjects/delete/'+id,
                                data: {
                                    "id": id,
                                    "_method": 'DELETE',
                                    "_token": token
                                }
                            })
                           .done(function(response){
                                bootbox.alert(response.success);
                                //removing the row that have been deleted
                                jQuery(row).fadeOut('slow');
                            })
                           .fail(function(){
                                bootbox.alert('Something Went Wrong .... Please contact administrator');
                            })
                        }
                    }
                }
            });
        });
Run Code Online (Sandbox Code Playgroud)

这是我不这样做时得到的php artisan route:list

在此输入图像描述

小智 1

将 ajax 调用中的类型更改为 POST,数据对象中的 _method 字段就足够了。这就是您的 ajax 调用的外观。Laravel 通过使用 _method 字段来确定 http 动词,从而“伪造”DELETE 方法。

$.ajax({
    type: 'POST',
    url: '/subjects/delete/'+id,
    data: {
        "_method": 'DELETE',
        "_token": token
    }
})
.done(function(response){
    bootbox.alert(response.success);
    //removing the row that have been deleted
    jQuery(row).fadeOut('slow');
})
.fail(function(){
    bootbox.alert('Something Went Wrong .... Please contact administrator');
})
Run Code Online (Sandbox Code Playgroud)