Laravel项目中Bootstrap X-Editable提交变更报405方法不允许错误
Laravel中使用Bootstrap X-Editable提交变更时出现405(Method Not Allowed)错误
在Laravel项目中使用Bootstrap X-Editable修改零件数量,点击提交按钮就弹出405错误,尝试将路由修改为PUT和POST方法后问题依然存在。相关代码如下:
JS代码
$(document).ready(function () { $.fn.editable.defaults.mode = "inline"; $.fn.editable.defaults.inputclass = "form-control input-sm"; // $.fn.editable.defaults.ajaxOptions = {type: "PUT"}; // $.fn.editable.defaults.ajaxOptions = {type: "POST"}; $(" .parts_qty").editable({ type: "number", title: "Enter parts qty", send: "always", url: "/service/service-report/update-parts", params: function (params) { params._token = $('meta[name=\"csrf-token\"]').attr("content"); params.id = $(this).data("pk"); params.qty = params.value; return params; }, success: function (response, newValue) { if (response.success) { alert("Data changed successfully!"); } }, error: function (response, newValue) { alert("Woops Something wrong!"); }, }); });
HTML代码
<table class="table table-hover table-bordered" id="table-parts"> <thead> <tr> <td><b>Part Number</b></td> <td><b>Part Description</b></td> <td><b>Qty</b></td> </tr> </thead> <tbody> @foreach (SiteHelpers::get_recommendation_parts($data->id) as $part) <tr> <td>{{ $part->part_number }}</td> <td>{{ $part->part_description }}</td> <td data-name='qty'><a href="javascript:;" class="parts_qty" data-pk="{{ $part->id }}">{{ $part->parts_qty }}</a></td> </tr> @endforeach </tbody> </table>
路由代码
Route::post('service/service-report/update-parts', 'Service\ServiceReportController@updateParts')->name('service-report/update-parts');
错误截图
405错误提示:

点击Ok按钮触发错误的场景:

解决方法
1. 确保X-Editable请求方法与路由完全匹配
X-Editable默认使用POST请求,Laravel的PUT/PATCH请求需要通过_method参数伪装HTTP方法:
如果路由用POST(当前配置):
取消注释JS中的$.fn.editable.defaults.ajaxOptions = {type: "POST"};,同时修正CSRF令牌的引号转义问题(去掉多余的转义符):params._token = $('meta[name="csrf-token"]').attr("content");如果路由改用PUT:
修改路由为:Route::put('service/service-report/update-parts', 'Service\ServiceReportController@updateParts')->name('service-report/update-parts');然后在JS的
params函数中添加_method参数:params._method = 'PUT';同时启用
ajaxOptions的POST配置(Laravel PUT请求实际仍以POST发送,靠_method识别):$.fn.editable.defaults.ajaxOptions = {type: "POST"};
2. 检查路由是否被拦截
执行php artisan route:list命令,确认/service/service-report/update-parts对应的请求方法和控制器方法正确,没有被其他路由规则(比如通配符路由)提前匹配。
3. 验证CSRF令牌传递
确保页面头部存在正确的CSRF meta标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
并且JS中获取令牌的代码没有语法错误,避免因令牌无效导致的请求被拦截。
4. 排查控制器方法的请求接收
在updateParts方法开头添加调试代码,确认实际接收到的请求方法:
public function updateParts(Request $request) { dd($request->method()); // 打印实际请求方法,判断是否与路由匹配 // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者Tommy Saputra
相关产品推荐
相关产品推荐

