2016-09-06 4 views
8

Ich versuche, mit AJAX in Laravel 5.3 Datensatz löschen, ich weiß, das ist eine der häufigsten Fragen und es gibt bereits viele Online-Lösungen und Tutorials zu diesem Thema. Ich habe einige von ihnen versucht, aber die meisten geben mir den gleichen Fehler NetworkError: 405 Method Not Allowed. Ich habe versucht, diese Aufgabe aus einem anderen Blickwinkel zu lösen, aber ich stecke fest und konnte nicht herausfinden, wo ich falsch liege. Deshalb habe ich diese Frage zur Leitlinie hinzugefügt.Wie lösche ich Datensatz in Laravel 5.3 mit Ajax Anfrage?

Ich versuche folgendes Skript zum Löschen des Datensatzes.

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}', '[email protected]'); 

In View

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

Wenn ich auf Löschtaste klicken bin es mir NetworkError: 405 Method Not Allowed in Konsole Fehler zurückgegeben. Ohne Ajax funktioniert die Löschfunktion korrekt.

Kann mir jemand sagen, wo ich falsch liege, dass ich das Problem beheben kann, würde ich gerne schätzen, wenn mich jemand diesbezüglich anleiten würde. Vielen Dank.

Antwort

13

Verwenden Sie statt Route::getRoute::delete.

Darüber hinaus ändern Sie die zu type: 'DELETE' im Ajax Anruf.


P.S.

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

Oder noch kürzer: Dieser Code

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

kann geschrieben werden

UserModel::destroy($id); 
+0

Danke für Leitlinie, ich folgte Ihren Anweisungen, aber immer noch vor demselben Problem. –

+0

Haben Sie versucht, in Ihrem Ajax-Anruf "type: DELETE" zu verwenden? – siannone

+0

Lassen Sie mich es überprüfen –

1

Ich bin ein Arbeitsfluss des Löschens, mit einem Antrag VERB wieder aufzunehmen.Hoffe, es

hilft und es gibt einen kommentierten Code in der Steuerung, die

In der Form (mit Messer), um eine Ajax-Anforderung umgehen konnte:

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

Route:

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

Product:

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

Im Redirect Teil, werde ich zurück zu meiner Liste Seite (admin.products) mit einem Erfolg Notifier. Die Route wäre:

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

So können Sie den Fluss vervollständigen.

1

Stellen Sie sicher, dies im meta-Tag Ihrer Ansicht

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

In Ihrem Routes, tun dies

Route::delete('/user/delete/{id}', '[email protected]'); 

In Ihrem Controller, tun dies

UserModel::destroy($id); 

oder hinzufügen

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

Da es eine delete Anfrage ist, müssten Sie die csrf_token zusammen mit Ihrem Ajax-Header senden, wie die offizielle Website angibt. https://laravel.com/docs/5.5/csrf#csrf-x-csrf-token

Stellen Sie sicher, dies vor dem Ajax-Aufruf

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

nun die

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

ich das hilft hoffen hinzuzufügen.