Я пытаюсь удалить запись с помощью ajax в laravel 5.3, я знаю, что это один из распространенных вопросов, и уже есть много онлайн-решений и учебных пособий по этой теме. Я пробовал некоторые из них, но большинство из них выдает ту же ошибку 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!'
    ]);
}

Routes.php

Route::get('/user/delete/{id}', 'UserController@destroy');

В поле зрения

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

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");
    });

Когда я нажимаю кнопку удаления, в консоли возвращается ошибка NetworkError: 405 Method Not Allowed. Без ajax такая же функция удаления работает правильно.

Может ли кто-нибудь направить меня, где я ошибаюсь, что я могу исправить проблему, я хотел бы быть признателен, если кто-то поможет мне в этом. Спасибо..

16
Ayaz Ali Shah 6 Сен 2016 в 16:58

3 ответа

Лучший ответ

Вместо использования Route::get используйте Route::delete.

В дополнение к этому измените type: 'Put' на type: 'DELETE' в вызове ajax.


P.S. Этот код

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

Можно записать как:

UserModel::find($id)->delete();

Или даже короче:

UserModel::destroy($id);

Имейте в виду, что ->delete() инициирует событие, а ::destroy() - нет.

18
siannone 1 Окт 2018 в 07:32
$(".deleteProduct").click(function(){
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
$.ajax(
{
    url: "user/delete/"+id,
    type: 'DELETE', // Just delete Latter Capital Is Working Fine
    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
   }
});

});

3
Ganesh Khartode 29 Дек 2018 в 07:39

Я возобновляю рабочий процесс удаления с запроса ГЛАГОЛ. Надеюсь, это поможет

и есть закомментированный код в контроллере, который может обрабатывать запрос ajax

В форме (с лезвием):

  {{ Form::open(['method' => 'DELETE', 'route' => ['admin.products.edit', $product->id], 'name' => 'delete']) }}
    {{ Form::close() }}

Маршрут:

Route::delete('admin/products/{id}/edit', ['as' => 'admin.products.edit', 'uses' => 'Product\ProductController@delete']);

ProductController:

 public function delete($id)
    {
        // if (Request::ajax()) {
        // if (Request::isMethod('delete')){

        $item = Product::findOrFail($id);
        $item->delete();

        return redirect()->route('admin.products')->with('flashSuccess', 'deleted');
    }

В части перенаправления я возвращаюсь на свою страницу списка (admin.products) с уведомлением об успехе. Маршрут будет:

Route::get('admin/products', ['as' => 'admin.products', 'uses' => 'Product\ProductController@getList']);

Так вы можете завершить поток.

1
Rodrigo Butta 6 Сен 2016 в 16:23