web-dev-qa-db-ja.com

ajaxリクエストを使用してlaravel 5.3のレコードを削除するには?

laravel 5.3でajaxを使用してレコードを削除しようとしていますが、これはよくある質問の1つであり、このトピックに関する多くのオンラインソリューションとチュートリアルが既にあります。それらですが、ほとんど同じエラーが発生します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がなければ、同じ削除機能が適切に機能しています。

誰でも私が問題を解決できるという間違っているところを案内できますか?誰かがこれに関して私を案内してくれたら感謝します。ありがとうございました..

11
Ayaz Shah

_Route::get_を使用する代わりに、_Route::delete_を使用します。

それに加えて、ajax呼び出しで_type: 'Put'_を_type: 'DELETE'_に変更します。


追伸このコード

_$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

これをビューのmetaタグに必ず追加してください

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

Routesで、これを行います

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

コントローラーで、これを行います

UserModel::destroy($id);

または

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

アカウントを削除するユーザーが実際にアカウントを所有していることを確認してください。

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

今すぐリクエストを送信

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

これがお役に立てば幸いです。

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

});

2
Ganesh Khartode

要求VERBを使用して、削除の作業フローを再開しています。それが役に立てば幸い

そして、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