2017-06-15 115 views
2

我知道有類似的問題與這個問題有關,但我已經試過我的副本後,與正確的答案,但仍然無濟於事。 我不斷收到此錯誤:如何刪除laravel中的記錄通過ajax

BadMethodCallException Method delete does not exist. in Macroable.php (line 74)

要快,這是我的控制器:

public function destroy(Subject $subject) 
{ 
    // 
    $response = array(); 

    $modal = new Subject; 
    $modal = Subject::find($subject); 

    if ($modal->delete()) { 
     $response['success'] = '<b>'.$modal->name.'</b>'.' successfully deleted'; 
     $response['subject'] = $modal; 
    } 

    return \Response::json($response); 

} 

這裏是我的路線:

Route::delete('/subjects/delete/{subject}', '[email protected]'); 

這是我的觀點:

<td> 
    <a data-token="{{ csrf_token() }}" id="delete" data-id="{{$subject->id}}" data-toggle="tooltip" title="Edit" href="/subjects/{{$subject->id}}" role="button"><i class="glyphicon glyphicon-trash text-danger"></i></a> 
</td> 

和最後我的腳本:

$(document).on('click', '#delete', function(event) { 
      event.preventDefault(); 
      /* Act on the event */ 

      // id of the row to be deleted 
      var id = $(this).attr('data-id'); 

      var token = $(this).data("token"); 

      console.log(id); 

      // row to be deleted 
      var row = $(this).parent("td").parent("tr"); 

      var message = "subject"; 

      bootbox.dialog({ 
       message: "Are you sure you want to Delete this "+message+"?", 
       title: "<i class='glyphicon glyphicon-trash'></i> Delete !", 
       buttons: { 
        success: { 
         label: "No", 
         className: "btn-success", 
         callback: function() { 
          $('.bootbox').modal('hide'); 
         } 
        }, 
        danger: { 
         label: "Delete!", 
         className: "btn-danger", 
         callback: function() { 

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

          $.ajax({ 
           type: 'DELETE', 
           url: '/subjects/delete/'+id, 
           data: { 
            "id": id, 
            "_method": 'DELETE', 
            "_token": token 
           } 
          }) 
          .done(function(response){ 
           bootbox.alert(response.success); 
           //removing the row that have been deleted 
           jQuery(row).fadeOut('slow'); 
          }) 
          .fail(function(){ 
           bootbox.alert('Something Went Wrong .... Please contact administrator'); 
          }) 
         } 
        } 
       } 
      }); 
     }); 

下面是當我不php artisan route:list

enter image description here

回答

1

改變你的AJAX調用POST類型我所得到的,在數據​​對象中的_method場的全部就是需要。這就是你的ajax調用應該看起來的樣子。 Laravel通過使用_method字段確定http動詞來「僞造」DELETE方法。

$.ajax({ 
 
    type: 'POST', 
 
    url: '/subjects/delete/'+id, 
 
    data: { 
 
     "_method": 'DELETE', 
 
     "_token": token 
 
    } 
 
}) 
 
.done(function(response){ 
 
    bootbox.alert(response.success); 
 
    //removing the row that have been deleted 
 
    jQuery(row).fadeOut('slow'); 
 
}) 
 
.fail(function(){ 
 
    bootbox.alert('Something Went Wrong .... Please contact administrator'); 
 
})

+0

我試過,但我仍然得到相同的錯誤。 –

+0

php artisan路線是什麼:列表顯示您的路線? – btl

+0

不知道你真的想知道什麼,所以我添加了我從php工匠路線中得到的結果的圖片:列表。你可以檢查這篇文章的更新。 –

1

我不知道爲什麼它以這種方式工作的技術細節,但似乎這個問題從我的控制器來破壞方法。所以,這一切都是我必須做的:

控制器代碼:

public function destroy($subject) 
{ 
    // 
    $response = array(); 

    $modal = new Subject; 
    $modal = Subject::find($subject); 

    if ($modal->delete()) { 
     $response['success'] = '<b>'.$modal->name.'</b>'.' successfully deleted'; 
     $response['subject'] = $modal; 
    } 

    return \Response::json($response); 

} 

腳本:

callback: function() { 

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

          $.ajax({ 
           type: 'DELETE', 
           url: '/subjects/delete/'+id, 
           data:{"id": id, "_method": 'DELETE'} 
          }) 
          .done(function(response){ 
           bootbox.alert(response.success); 
           //removing the row that have been deleted 
           jQuery(row).fadeOut('slow'); 
          }) 
          .fail(function(){ 
           bootbox.alert('Something Went Wrong .... Please contact administrator'); 
          }) 
         } 

路線:

Route::delete('/subjects/delete/{subject}','[email protected]'); 

對我來說,最主要的是去除從destroy()參數Subject它工作。 如果你們中的任何一個人知道它爲什麼起作用,請提供和解釋,以便我也能理解它。謝謝!!