Laravel 8 - 此路由不支持 POST 方法。支持的方法:删除

Posted

技术标签:

【中文标题】Laravel 8 - 此路由不支持 POST 方法。支持的方法:删除【英文标题】:Laravel 8 - The POST method is not supported for this route. Supported methods: DELETE 【发布时间】:2021-03-17 02:28:04 【问题描述】:

我试图通过单击输入提交按钮提交表单来从 DataTable 中删除记录,但此错误始终显示:

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException 此路由不支持 POST 方法。支持的方法:DELETE。

这是我当前在 web.php 中声明的路线:

Route::delete('sales/deleteSalesOrder/id', 'Transaction\SaleController@deleteSalesOrder')->name('sales/deleteSalesOrder/id')->middleware('role:A');

这是我在 DataTable 中创建表单的 sn-p 代码:

public function dataTableTrash()

    $data = SalesH::where('active', '=', 2);
    
    return Datatables::of($data)
        ->addColumn('action', function($data)

        $url = url('transaction/sales/'.$data->id);
        $undoTrash = url('sales/undoTrash/'.$data->id);
        $urlDestroy = url('sales/deleteSalesOrder/'.$data->id);

        $view = "<a class = 'btn btn-primary' href = '".$url."' title = 'View'><i class = 'nav icon fas fa-eye'></i></a>";
        $undo = "<button data-url = '".$undoTrash."' onclick = 'undoTrash(this)' class = 'btn btn-action btn-success' title = 'Re-Activate'><i class='fas fa-trash-restore-alt'></i></button>";
        $delete = "<form action='$urlDestroy' class = 'deleteForm' method='post'>
                        <div class='form-group'>
                            <input type='submit' class='btn btn-danger delete-user' value='Delete'>
                        </div>
                    </form>";
                    
        return $view."".$undo."".$delete;

    )->editColumn('date', function($data)
        return date('d-m-Y', strtotime($data->date));
    )->editColumn('total', function($data)
        return number_format($data->total, 0, '.', ',');
    )
    ->rawColumns(['action'])
    ->make(true);

您注意到该表单还没有 csrf_field()method_field('DELETE')。我所做的只是在刀片文件中使用 JQuery 添加它。

@push('js')

<script>
  $(document).ready(function() 
     $('.deleteForm').submit(function(event) 
     event.preventDefault();
     console.log('LOL I am working!');
     $(this).append(' csrf_field() ');
     $(this).append(' method_field('DELETE') ');
     if (confirm('Are you sure you want to PERMANENTLY delete this data?')) 
        event.currentTarget.submit();
     );
   
</script>
@endpush

最后是我的deleteSalesOrder()(删除数据的方法):

public function deleteSalesOrder($id)

     $data = SalesH::find($id);
     $data->delete();

     if($data->save())
         Toastr::success('Sales Order has been permanently deleted.', 'Success');
         return view('Transaction.Sales.index');
     else
         Toastr::error('Sales Order failed to be deleted.', 'Error');
         return view('Transaction.Sales.index');
     

是什么导致了这个错误?仅使用 JQuery 附加 csrf_field()method_field('DELETE') 是否正确?在这种情况下如何解决问题并成功删除数据?

【问题讨论】:

【参考方案1】:

这里的问题是您要附加到一个名为deleteForm 的表单,该表单不存在。您的 from 中没有 name 属性,而是 id 属性。并且每个表单都具有相同的 id,这不会像在 dom 中那样工作,应该只有一个具有 id 的元素。最好使用类属性,并在提交表单时将这些 csrf 和方法字段添加到该表单,而不是在文档中准备好。 表格

<form action='$urlDestroy' class='deleteForm' method='post'>

然后在脚本中

$('.deleteForm').submit(function(event) 
    event.preventDefault();
    $(this).append(' csrf_field() ');
    $(this).append(' method_field('DELETE') ');
    // write confirm code if you want
    event.currentTarget.submit();
);

【讨论】:

感谢您对 deleteForm 的澄清。我尝试了您的解决方案,但是当我单击删除按钮时,它显示Page Expired。知道如何解决吗? 这意味着event.preventDefault() 不工作。确保您已经添加了类,并尝试在文档就绪函数中添加此代码块。 听从了您的指示。还在 ready 函数中添加了您的 snipper 代码解决方案,但仍然是 Page Expired 在preventDefault之后注释掉其余的代码,在preventDefault之后添加一个控制台日志..检查函数是否真的命中 控制台日志不打印任何内容,它立即转到Page Expired

以上是关于Laravel 8 - 此路由不支持 POST 方法。支持的方法:删除的主要内容,如果未能解决你的问题,请参考以下文章

此路由不支持 GET 方法。支持的方法:POST。 laravel 5.8 阿贾克斯

错误:此路由不支持 POST 方法。支持的方法:GET、HEAD。 - 使用 laravel livewire

此路由不支持 PUT 方法。支持的方法:GET、HEAD、POST。在 laravel 中

laravel向我显示此错误此路由不支持POST方法。支持的方法:GET,HEAD,PUT,DELETE

此路由不支持 post 方法

此路由不支持 POST 方法。支持的方法:GET、HEAD。",...