УДАЛИТЬ не работает в Laravel Datatable - PullRequest
0 голосов
/ 10 февраля 2020

Я работаю с Laravel Datatable, и я застрял в одной точке. Ниже приведен код для удаления записи в модели TagManagement. Но это не удалить запись, и хуже всего то, что она не показала никакой ошибки. Кто-нибудь может найти ошибку в коде ниже?

просмотр

 $(document.body).on("click",".remove-tag", function () {

        var tag_id = $(this).data('id');
        showConfirm("DELETE", "Do you want to delete this Tag ?","deleteTag("+tag_id+")");
    });

    function deleteTag(id){
        $.ajax({
            type: 'get',
            url: '{!! url('delete-tag') !!}',
            data: {tag_id: id},
            success: function (data) {
                    if (data == "SUCCESS") {
                        $('[data-id="' + id + '"]').closest('tr').remove();
                        showAlert("SUCCESS","Delete Tag successful");
                    }
                }, error: function (data) {

                    showAlert("FAIL","Delete Tag fail");
                }

        });
    }
        var tag_id = $(this).data('id');
        showConfirm("DELETE", "Do you want to delete this Tag ?","deleteTag("+tag_id+")");
    });

    function deleteTag(id){
        $.ajax({
            type: 'get',
            url: '{!! url('delete-tag') !!}',
            data: {tag_id: id},
            success: function (data) {
                    if (data == "SUCCESS") {
                        $('[data-id="' + id + '"]').closest('tr').remove();
                        showAlert("SUCCESS","Delete Tag successful");
                    }
                }, error: function (data) {

                    showAlert("FAIL","Delete Tag fail");
                }

        });
    }

Контроллер

public function destroy($id)
    {

        $tagManagement = TagManagement::find($id);
        $deleted = $tagManagement->delete();

        if ($deleted) {
            return "SUCCESS";
        } else {
            return "FAIL";
        }
    }

public function loadTags()
{

    $Tags = TagManagement::all();

    return DataTables::of($Tags)
        ->addColumn('action', function ($tag) {
            return '<a href="' . url('/tags/' . $tag->id . '/edit') . '" class="btn btn-default edit_btn_styles" data-toggle="tooltip" data-placement="top" title="Edit"><i class="fa fa-wrench" aria-hidden="true"></i></a>
                    <button type="button" data-id="' . $tag->id . '" class="btn btn-default remove-tag remove-btn" data-toggle="tooltip" data-placement="top" title="Delete"><i class="fas fa-trash-alt" aria-hidden="true"></i></button>';
        })
        ->rawColumns(['action'])
        ->make(true);
}

}

**Route**

Route :: get ('/ delete-tag', 'AdminPanel \ TagController@destroy');


Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Ваш маршрут и метод контроллера не соответствуют. Прежде всего, лучше использовать метод HTTP-запроса «удалить» для действий по удалению, но это не то, что вызывает вашу проблему.

Вы определили свой маршрут как /delete-tag, но в вашем контроллере вы ожидаете $id в качестве параметра для вашего destroy метода. Чтобы это работало, вам нужно иметь маршрут, подобный этому /delete-tag/{id}, и соответственно создать URL для вашего ajax вызова на внешнем интерфейсе. Я удивлен, что вы не получите исключение Missing argument 1 for App\Providers\RouteServiceProvider::{closure}() для неправильного формирования запроса таким образом.

Laravel документация очень хорошо объясняет, как определять маршруты с параметрами.

Было бы полезно, если бы вы включили Laravel версию в свой вопрос.

Вот как это должно работать:

Определение маршрута

Route::delete('/delete-tag/{id}', 'AdminPanel\TagController@destroy')->name('delete-tag');

JS функция

function deleteTag(id){
        let route = '{!! route('delete-tag', ['id' => '%id%']) !!}';
        $.ajax({
            type: 'post',
            url: route.replace('%id%', id);,
            data: {_method: 'delete'},
            success: function (data) {
                    if (data == "SUCCESS") {
                        $('[data-id="' + id + '"]').closest('tr').remove();
                        showAlert("SUCCESS","Delete Tag successful");
                    }
                }, error: function (data) {

                    showAlert("FAIL","Delete Tag fail");
                }

        });
    }
0 голосов
/ 10 февраля 2020

Это не проблема Datatable, вы пропустили какой-то код, вы не правильно определили route & jQuery function, ваша функция destroy($id) получила параметр, но вы не получили никакого параметра в вашем route & you не отправлять _token в вашем ajax действии, которое вам нужно отправить _token

Проверьте Мой код Я отредактировал ваш код.

//Change your Route
Route::get('delete-tag/{id}', 'AdminPanel\TagController@destroy')->name('deleteTag');

//Change your function
function deleteTag(id){
    $.ajax({
        type: "GET",
        dataType: 'JSON',
        url:'{{ route('deleteTag', '') }}/'+id,
        data: {_token: '{{csrf_token()}}'},
        success: function (data) {
            if (data == "SUCCESS") {
                $('[data-id="' + id + '"]').closest('tr').remove();
                showAlert("SUCCESS","Delete Tag successful");
            }
        }, error: function (data) {

            showAlert("FAIL","Delete Tag fail");
        }
    });
}
...