【问题标题】:Laravel delete method gives "Method not allowed" error on yajra datatableLaravel 删除方法在 yajra 数据表上给出“方法不允许”错误
【发布时间】:2019-11-25 01:34:14
【问题描述】:

我对以下 Laravel 函数有问题,删除选项不起作用,它给出“不允许方法”错误,出于某种奇怪的原因,即使我给它一个路由 ID,它也无法显示整个页面。

这是视图,admin.unsertable。我只是想纠正“删除”错误

<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
    <!-- Bootstrap 3.3.5 -->
    <link href="{{ asset('bootstrap/css/bootstrap.min.css') }}" rel="stylesheet" type="text/css" >
    <!-- Font Awesome -->
    <link href="{{ asset('fonts/font-awesome.min.css') }}" rel="stylesheet" type="text/css" >
    <!-- Ionicons -->
    <link href="{{ asset('fonts/ionicons.min.csss') }}" rel="stylesheet" type="text/css" >
    <!-- Theme style -->
    <link href="{{ asset('dist/css/AdminLTE.min.css') }}" rel="stylesheet" type="text/css" >
    <!-- AdminLTE Skins. Choose a skin from the css/skins
         folder instead of downloading all of them to reduce the load. -->
    <link href="{{ asset('dist/css/skins/_all-skins.min.css') }}" rel="stylesheet" type="text/css" >
    <!-- iCheck -->
    <link href="{{ asset('plugins/iCheck/flat/blue.css') }}" rel="stylesheet" type="text/css" >
    <!-- Morris chart -->
    <link href="{{ asset('plugins/morris/morris.css') }}" rel="stylesheet" type="text/css" >
    <!-- jvectormap -->
    <link href="{{ asset('plugins/jvectormap/jquery-jvectormap-1.2.2.css') }}" rel="stylesheet" type="text/css" >
    <!-- Date Picker -->
    <link href="{{ asset('plugins/datepicker/datepicker3.css') }}" rel="stylesheet" type="text/css" >
    <!-- Daterange picker -->
    <link href="{{ asset('plugins/morris/morris.css') }}" rel="stylesheet" type="text/css" >
    <link href="{{ asset('plugins/daterangepicker/daterangepicker-bs3.css') }}" rel="stylesheet" type="text/css" >
    <!-- bootstrap wysihtml5 - text editor -->
     <link href="{{ asset('public/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css') }}" rel="stylesheet" type="text/css" >

    <link rel="stylesheet" href="//cdn.datatables.net/1.10.7/css/jquery.dataTables.min.css">

<body class="hold-transition skin-blue sidebar-mini">
     <header class="main-header">
        <!-- Logo -->
        <a href="{{ route('admin.dashboard') }}" class="logo">
          <!-- mini logo for sidebar mini 50x50 pixels -->
          <span class="logo-mini"><b>A</b>LT</span>
          <!-- logo for regular state and mobile devices -->
          <span class="logo-lg"><b>Plu</b>SIS</span>
        </a>
        <!-- Header Navbar: style can be found in header.less -->
        <nav class="navbar navbar-static-top" role="navigation">
          <div class="navbar-custom-menu">
            <ul class="nav navbar-nav">
              <!-- User Account: style can be found in dropdown.less -->
              <li class="dropdown user user-menu">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                  <span class="hidden-xs">Usuario</span>
                </a>
                <ul class="dropdown-menu">
                  <!-- User image -->
                  <li class="user-header">

                    <p>

                    </p>
                  </li>
                  <!-- Menu Body -->
                  <li class="user-body">
                    <div class="col-xs-4 text-center">
                      <!--<a href="#">Followers</a>-->
                    </div>
                    <div class="col-xs-4 text-center">
                     <!-- <a href="#">Sales</a>-->
                    </div>
                    <div class="col-xs-4 text-center">
                     <!-- <a href="#">Friends</a>-->
                    </div>
                  </li>
                  <!-- Menu Footer-->
                  <li class="user-footer">
                    <div class="pull-left">
                      <a href="{{ route('user.profile', auth()->user()->id) }}" class="btn btn-default btn-flat">Perfil</a>
                    </div>
                    <div class="pull-right">
                      <a href="{{ route('user.logout') }}" class="btn btn-default btn-flat">Salir</a>
                    </div>
                  </li>
                </ul>
              </li>
              <!-- Control Sidebar Toggle Button -->
              <li>
                <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
              </li>
            </ul>
          </div>
        </nav>
      </header>

<body>

<div class="panel-body">
<div id="message">

</div>
<table class="table table-bordered table-striped" id="laravel_datatable">
        <thead>
            <tr>
                <th>Email</th>
                <th>Type</th>
                <th>Accion</th>
            </tr>
        </thead>
        <tbody>

        </tbody>
</table>

{{ csrf_field() }}

</div>

        <!-- jQuery -->
        <script src="//code.jquery.com/jquery.js"></script>
        <!-- DataTables -->
        <script src="//cdn.datatables.net/1.10.7/js/jquery.dataTables.min.js"></script>

        <script>
 $(document).ready( function () {

      fetch_data();

      function fetch_data(){
        $.ajax({
        url:"/shoppingcart/public/admin/usertable/fetch_data",
        dataType:"json",
        success:function(data){
          var html = '';
          html += '<tr>';
          html += '<td contenteditable id="email"></td>';
          html += '<td contenteditable id="type"></td>';
          html += '<td><button type="button" class="add" id ="add">Add</button></td></tr>'

          for(var count=0; count < data.length; count++){
            html += '<tr>';
            html += '<td class="column_name" data-column_name="email" id ="'+data[count].id+'">'+data[count].email+'</td>';
            html += '<td contenteditable class="column_name" data-column_name="type" id ="'+data[count].id+'">'+data[count].type+'</td>';
            html += '<td><button type="button" class="btn btn-dange delete" id="'+data[count].id+'">Delete</button></td></tr>'
          }
          $('tbody').html(html);
        }
      })
      }

      var _token = $('input[type="_token"]').val();

      $(document).on('click', '#add', function(){
         var type = $('#type').text();
         if(type != ''){

            $.ajax({
               url:"{{ route('admin.add_data') }}",
               method:"POST",
               data:{type:type},
               success:function(data)
               {
                 $('#message').html(data);
                 fetch_data();
               }
            });

         }else{
           $('#message').html("<div class='alert alert-danger'>Debes editar el campo</div>");
         }

      });

     });

     $(document).on('click', '.delete', function() { //No obtiene la página, da un error 419 al hacer POST por alguna razón
       var id = $(this).attr("id");
       if(confirm("Estas seguro de esto?"))
       {
         $.ajax({
           url:"{{ route('admin.deleteuser') }}",
           method:"POST",
           data:{id:id},
           success:function(data)
           {
            $('#message').html(data);
            fetch_data();
           }
         })
       }
     });
</script>

</body>

它的控制器叫AdminController,运行如下方法,与数据库通信,删除行。定义了数据库,因为如果它用 fetch_data 的方法给我带来数据

public function deleteuser(Request $request){
    if($request->ajax())
    {
        DB::table('users')->where('id', $request->id)->delete();
        echo '<div class="alert alert-success">Data deleted</div>';
    }
}

这些是路线

Route::get('/admin/usertable', 'AdminController@listuser')    
->middleware('is_admin')    
->name('admin.usertable');

Route::get('/admin/usertable/fetch_data', 'AdminController@fetch_data')    
->middleware('is_admin')    
->name('admin.usertable');

Route::delete('/admin/usertable/deleteuser/{id}', 'AdminController@deleteuser')    
->middleware('is_admin')    
->name('admin.deleteuser');

【问题讨论】:

  • 嗯,ajax方法设置为POST,而laravel路由方法是delete。您可以设置一个名为_method 的参数,其值为'delete',以及标题上的crsf 标记和一个名为_token 的参数。此外,laravel 路由在 uri 中需要一个参数 {id},而你没有传递它
  • 谢谢。那么,代码的正确版本是什么?

标签: laravel eloquent


【解决方案1】:

ajax 方法设置为POST,而 Laravel 路由方法设置为delete。您可以设置一个名为_method 的参数,其值为'delete',以及标题上的crsf token 和一个名为_token 的参数。此外,Laravel 路由在 uri 中需要一个参数 {id},而您没有传递它。

如果你有 csrf 令牌我是一个元标记,像这样:

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

你可以从那里得到它

var token = $('meta[name="csrf-token"]').attr('content');

但是,如果你在刀片中,你可以直接使用csrf_token() helper

var token = '{{ csrf_token() }}';

然后,将令牌分配给 ajax 标头:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': token,
        'X-Requested-With': 'XMLHttpRequest',
    }
});

设置名为_method 的参数为'delete',并设置名为_token 的参数为令牌值:

$(document).on('click', '.delete', function() {
    var id = $(this).attr("id");
    if(confirm("Estas seguro de esto?"))
    {
        $.ajax({
            url:"{{ route('admin.deleteuser') }}",
            method:"POST",
            data:{
                id:id,
                // set a parameter named _method with value 'delete'
                _method: 'delete',
                // set a parameter named _token with the token value
                _token: token
            },
            success:function(data) {
                //...
            }
        })
    }
});

从你的 laravel 路由中移除 {id} 参数,因为你没有使用它:

Route::delete('/admin/usertable/deleteuser', 'AdminController@deleteuser')    
->middleware('is_admin')    
->name('admin.deleteuser');

更新

$(document).on('click', '.delete', function() {
    var token = '{{ csrf_token() }}';
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': token,
            'X-Requested-With': 'XMLHttpRequest',
        }
    });
    var id = $(this).attr("id");
    if(confirm("Estas seguro de esto?"))
    {
        $.ajax({
            url:"{{ route('admin.deleteuser') }}",
            method:"POST",
            data:{
                id:id,
                _method: 'delete',
                _token: token
            },
            success:function(data) {
                //...
            }
        })
    }
});

【讨论】:

  • 嘿,谢谢,但现在错误是“未定义令牌”
  • 您必须在使用之前声明变量并为其赋值。查看我将所有内容放在一起的更新答案
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
相关资源
最近更新 更多