如何修复 "The GET method is not supported for this route. Supported methods: PUT."

How to fix "The GET method is not supported for this route. Supported methods: PUT."

当我提交更新某些数据的请求时,出现此错误 "The GET method is not supported for this route. Supported methods: PUT."。如何摆脱这个?

这里我添加了web.php、AdminController.php和JS函数的代码来填充数据表。

路线:

Route::group(['prefix' => '/admins'], function () {
    Route::get('/show', [
        'uses' => 'AdminController@show',
        'as'   => 'admins.show',
    ]);

    Route::put('/approve/{id}',     [
        'uses' => 'AdminController@approve',
        'as'   => 'admins.approve',
    ]);
});

管理员控制器:

public function show()
{
    return Datatables::of(User::query()->whereNotNull('email_verified_at'))->make(true);
}

public function approve(Request $request, $id)
{
    $user = User::find($id);
    $user->approved_by = Auth::user()->name;
    $user->approved_at = new \DateTime();

    $user->save();

    return redirect('/admins/show');
} 

数据表函数:


$(function () {
    $('#admins').DataTable({
        processing: true,
        serverSide: true,
        autoWidth: true,
        scrollX: true,
        order: [[1, "asc"]],
        pagingType: "full_numbers",
        ajax: '{{ url('admins/ show') }}',
        columns: [
            { data: 'id', name: 'id' },
            { data: 'name', name: 'name' },
            { data: 'email', name: 'email' },
            { data: 'email_verified_at', name: 'email_verified_at' },
            { data: 'approved_by', name: 'approved_by' }
        ],
        columnDefs: [
            {
                targets: 0,
                visible: false,
                searchable: false
            },
            {
                targets: 5,
                render: function (data, type, row, meta) {
                    if (row.approved_by === null) {
                        return "<form action=\"/admins/approve/" + row.id + "\" method=\"put\"><input type=\"submit\" class=\"btn btn-success\" value=\"Approve\"></form><button type=\"button\" class=\"btn btn-danger\">Delete</button>";
                    } else {
                        return "<button type=\"button\" class=\"btn btn-primary\">Reject</button><button type=\"button\" class=\"btn btn-danger\">Delete</button>";
                    }
                },
                className: "col-action",
                searchable: false,
                orderable: false
            }
        ]
    });
});

Web 服务器通常不支持 PUT 等 HTTP 动词,Laravel 使用方法欺骗实现此目的,因此您需要传递一个输入 type=hidden指定要使用的方法。出于同样的原因,您的表单操作需要 "POST"。

 return "<form action=\"/admins/approve/" + row.id + "\" method=\"POST\">
               <input type=\"hidden\" name=\"_method\" value=\"PUT\">"

还要确保您在 POST 请求中传递了 csrf-token

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

  1. 在 laravel 中,您需要发送一个值为 PUT 的键 _method(不区分大小写),以便能够告诉 laravel 您正在发送请求put 方法。 more info
  2. 由于您的路由在 web.php 而您的方法不是 GET,您需要在请求中发送一个 csrf 令牌。发送值为 csrf 令牌的密钥 _token。您可以默认为所有 $.ajax 请求执行此操作。使用 this 代码。

在您的渲染方法中进行这些更改,您就可以开始了。

render: function(data, type, row, meta) {
  if (row.approved_by === null) {
    return "<form action=\"/admins/approve/" + row.id + "\" method=\"post\"><input type=\"hidden\" name=\"_method\" value=\"PUT\"><input type=\"submit\" class=\"btn btn-success\" value=\"Approve\"></form><button type=\"button\" class=\"btn btn-danger\">Delete</button>";
  } else {
    return "<button type=\"button\" class=\"btn btn-primary\">Reject</button><button type=\"button\" class=\"btn btn-danger\">Delete</button>";
  }
},

我没有包含发送 csrf 令牌的代码。您可以使用 this link.

为整个应用程序执行此操作