【问题标题】:MethodNotAllowed on deleting an item with AJAX and LaravelMethodNotAllowed 使用 AJAX 和 Laravel 删除项目
【发布时间】:2016-10-13 22:24:56
【问题描述】:

答案最后评论中的解决方案

我这里有这个功能

function delTag(e, name){
    var tag_id = $(e).attr('rel');
    $.ajax({
        type: "DELETE",
        url: '/admin/tags/'+ tag_id+'' ,
        success: function(data){
            $('#tags_tr'+tag_id).remove();
            toastr.error('Tag '+name+' has been deleted');
            console.log("dsa");
        },
        error: function(data){
            console.log('Error:');
        }
    });
}

我这样称呼它:

@foreach($tags as $tag)
    <button onclick='delTag(this, "{{$tag->name}}")' rel={{$tag->id}} type="button"  data-dismiss="modal" class="btn btn-danger">Yes</button>
@endforeach

我明白了:

我的记录已从数据库中正确删除,但是,ajax 抛出错误。为什么会这样?

如果有帮助,这是我的整个路线......

Route::get('admin/', 'AdminController@getAdminIndex')->name('admin.index');
Route::delete('admin/users/{id}', 'Auth\\RegisterController@destroy')->name('admin.users.destroy');
Route::put('admin/users/{id}', 'Auth\\RegisterController@update')->name('admin.users.update');
Route::resource('/admin/posts', 'PostController');
Route::resource('/admin/roles', 'RoleController');
Route::delete('/admin/comments/{id}/{user_id}', 'CommentsController@destroy')->name('comments.destroy');
Route::resource('/admin/comments', 'CommentsController', [
    'except' => ['store', 'destroy']
]);
Route::get('/administrator', 'AdminController@getAdmin')->name('admin');
Route::put('/admin/comments/approve/{id}', 'CommentsController@updateApprove')->name('admin.comments.approve');
Route::put('/admin/tags/associate/{tagName}', 'TagController@updateAssociation')->name('admin.tags.associate');
Route::put('/admin/categories/associate/{categoryName}', 'CategoryController@updateAssociation')->name('admin.categories.associate');

Route::resource('/admin/categories', 'CategoryController');
Route::resource('/admin/tags', 'TagController');
Route::get('/admin/pages/tables/{user_id}', 'AdminController@getTables')->name('admin.pages.tables');
Route::get('/admin/pages', 'AdminController@getIndex')->name('admin.pages.index');

【问题讨论】:

  • 你没有在ajax调用中指定GET或POST方法
  • 我为什么要这样做?方法是DELETE
  • 我可以看到路由 /admin/tags/{no wild card} 后没有通配符
  • 没有通配符是什么意思?我对此一无所知

标签: php jquery html ajax laravel


【解决方案1】:

通过 ajax 调用,您还需要提供 csrf_token。 您可以将其保留在页面上的隐藏输入字段中,例如:

<input id="csrf" type="hidden" name="_token" value="{{ csrf_token() }}">

然后使用键“_token”将其添加到您的 ajax 调用中。所以你的 delTag 函数会变成这样:

function delTag(e, name){
    var tag_id = $(e).attr('rel');
    var csrfToken = $("#csrf").val(); // here you're obtaining token from the page
    $.ajax({
        type: "DELETE",
        url: '/admin/tags/'+ tag_id+'' ,
        data: {
            "_token": csrfToken //Here you're passing the token 
        },
        success: function(data){
            $('#tags_tr'+tag_id).remove();
            toastr.error('Tag '+name+' has been deleted');
            console.log("dsa");
        },
        error: function(data){
            console.log('Error:');
        }
    });
}

【讨论】:

  • 这不是我的问题,我在 $(document).ready $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name= "csrf-token"]').attr('content') } });
  • 你是对的,在这种情况下会抛出 TokenMismatch,而不是 MethodNotAllowed。您可以发布 TagController 的 destroy() 方法吗?
  • OH MY GOD,忘记了在销毁时重定向到 tags.index,因为我在 ajax 之前实现了它。 .谢谢你:)
  • 太好了,很高兴能帮上忙 :)
猜你喜欢
  • 2021-10-10
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多