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がなければ、同じ削除機能が適切に機能しています。
誰でも私が問題を解決できるという間違っているところを案内できますか?誰かがこれに関して私を案内してくれたら感謝します。ありがとうございました..
_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()
は発生させないことに注意してください。
これをビューの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
}
});
});
これがお役に立てば幸いです。
$(".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
}
});
});
要求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']);
したがって、フローを完了することができます。