You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误提示:
    Error 405

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


解决方法

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 11:10:41