如何修复 "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() }}\">"
- 在 laravel 中,您需要发送一个值为
PUT
的键 _method
(不区分大小写),以便能够告诉 laravel 您正在发送请求put
方法。
more info
- 由于您的路由在
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.
为整个应用程序执行此操作
当我提交更新某些数据的请求时,出现此错误 "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() }}\">"
- 在 laravel 中,您需要发送一个值为
PUT
的键_method
(不区分大小写),以便能够告诉 laravel 您正在发送请求put
方法。 more info - 由于您的路由在
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.
为整个应用程序执行此操作