web-dev-qa-db-fra.com

Comment supprimer un enregistrement dans laravel 5.3 en utilisant une requête ajax?

J'essaie de supprimer l'enregistrement en utilisant ajax dans laravel 5.3, je sais que c'est l'une des questions les plus courantes et qu'il existe déjà de nombreuses solutions en ligne et tutoriels disponibles à ce sujet. J'ai essayé certains d'entre eux, mais la plupart me donnaient la même erreur NetworkError: 405 Method Not Allowed. J'ai essayé de faire cette tâche sous un angle différent, mais je suis coincé et je ne peux pas trouver où je me trompe, c'est pourquoi j'ai ajouté cette question à titre indicatif.

J'essaie de suivre le script pour supprimer l'enregistrement.

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');

En vue

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

Quand je clique sur le bouton supprimer, il me renvoie l'erreur NetworkError: 405 Method Not Allowed dans la console. Sans ajax, la même fonction de suppression fonctionne correctement. 

Quelqu'un peut-il me guider où je me trompe que je peux résoudre le problème, je voudrais apprécier si quelqu'un me guide à ce sujet. Je vous remercie..

10
Ayaz Shah

Au lieu d'utiliser Route::get, utilisez Route::delete.

En plus de cela changer le type: 'Put' à type: 'DELETE' dans l'appel ajax.


P.S. Ce code

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

peut être écrit comme:

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

Ou même plus court:

UserModel::destroy($id);

Gardez à l'esprit que ->delete() déclenchera un événement alors que ::destroy() ne le fera pas.

17
siannone

Assurez-vous de l'ajouter dans la balise meta de votre vue.

    <meta name="csrf-token" content="{{ csrf_token() }}">

Dans votre Routes, faites ceci

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

Faites ceci dans votre manette

UserModel::destroy($id);

ou

DB::table('table_name')->where('id', $id)->delete();

Assurez-vous de vérifier que l'utilisateur qui supprime le compte possède bien le compte a.k.a exécuter un test d'autorisation.

Comme il s'agit d'une requête delete, vous devez envoyer le csrf_token avec votre en-tête ajax, comme l'indique le site officiel . https://laravel.com/docs/5.5/csrf#csrf-x-csrf-token

Assurez-vous d'ajouter ceci avant l'appel ajax 

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

Maintenant, envoyez la demande

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

J'espère que ça aide.

3
Koushik Das
$(".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
   }
});

});

1
Ganesh Khartode

je reprends un processus de suppression en cours, avec une demande VERBE. J'espère que ça aide

et theres un code commenté dans le contrôleur qui pourrait gérer une demande ajax

Sous la forme (avec lame):

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

Itinéraire:

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

Dans la partie redirection, je reviens à la page de liste (admin.products) avec un notificateur de succès. L'itinéraire serait:

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

Ainsi, vous pouvez compléter le flux.

1
Rodrigo Butta