Как исправить «Метод GET не поддерживается для этого маршрута. Поддерживаемые методы: PUT.» - PullRequest
2 голосов
/ 10 мая 2019

Когда я отправляю запрос на обновление некоторых данных, я получаю эту ошибку «Метод 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 ]

1 голос
/ 10 мая 2019
  1. В laravel вам необходимо отправить ключ _method со значением PUT (без учета регистра), чтобы сообщить laravel, что вы отправляете запрос методом put. больше информации
  2. Поскольку ваш маршрут в web.php и ваш метод не GET, вам необходимо отправить токен csrf вместе с запросом.Отправьте ключ _token со значением токена csrf.Вы можете сделать это по умолчанию для всех запросов $.ajax.Используйте этот код.

Внесите эти изменения в ваш метод рендеринга, и вам будет хорошо.

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Вы можете сделать это для всего приложения, используя эту ссылку.

1 голос
/ 10 мая 2019

HTTP-глаголы, такие как PUT , как правило, не поддерживаются веб-серверами, Laravel достигает этого с помощью подмены методов, поэтому вам нужно будет передать тип ввода = hidden, указав метод, который вы хотите использовать. И ваша форма действия должна "POST" по той же причине.

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

Также убедитесь, что вы передаете csrf-token с вашими запросами POST.

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

...