【问题标题】:How to fix "The GET method is not supported for this route. Supported methods: PUT."如何修复“此路由不支持 GET 方法。支持的方法:PUT。”
【发布时间】:2023-03-03 06:52:21
【问题描述】:

当我提交更新某些数据的请求时,我收到此错误“此路由不支持 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',
    ]);
});

管理员控制器:

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

【问题讨论】:

    标签: laravel yajra-datatable


    【解决方案1】:

    PUT 这样的 HTTP 动词通常不被网络服务器支持,Laravel 使用方法欺骗来实现这一点,所以你需要传递一个 input type=hidden 来指定你想要使用的方法。出于同样的原因,您的表单操作需要“发布”。

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

    还要确保您通过 POST 请求传递 csrf-token

    &lt;input type=\"hidden\" name=\"_token\" value=\"{{ csrf_token() }}\"&gt;"

    【讨论】:

    • 我试过 POST 方法,但出现“419:Page Expired”错误。
    • 你没有通过你的 post 请求传递 csrf 令牌
    • 我更新了我的答案,使用 csrf_token 输入字段,将其添加到您现有的字段中。
    • 你拼错了csrf_token()
    【解决方案2】:
    1. 在 laravel 中,您需要发送一个值为 PUT(不区分大小写)的键 _method,以便能够告诉 laravel 您正在使用 put 方法发送请求。 more info
    2. 由于你的路由在web.php,而你的方法不是GET,你需要在请求中发送一个csrf令牌。发送密钥 _token,其值为 csrf 令牌。默认情况下,您可以对所有 $.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 链接为整个应用程序执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-12
      • 2019-12-29
      • 2020-04-03
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2020-04-13
      相关资源
      最近更新 更多