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