如何解决“此路由不支持GET方法。受支持的方法:PUT。”

时间:2019-05-10 19:57:19

标签: laravel yajra-datatable

当我提交更新某些数据的请求时,出现此错误“此路由不支持GET方法。受支持的方法: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',
    ]);
});

AdminController:

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
            }
        ]
    });
});

2 个答案:

答案 0 :(得分:1)

Web服务器通常不支持

HTTP动词(例如 PUT ),Laravel使用方法欺骗来实现此目的,因此您需要传递一个输入type = hidden来指定要使用的方法。出于相同的原因,您的表单操作也需要“ POST”。

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

还要确保您在POST请求中传递了 csrf令牌

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

答案 1 :(得分:0)

  1. 在laravel中,您需要发送一个值为_method(不区分大小写)的密钥PUT,以便能够告诉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链接为整个应用程序完成此操作。