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

Laravel5.6中AJAX调用资源控制器edit方法报错:路由未定义

解决Laravel AJAX调用资源控制器edit方法的路由错误问题

你遇到的Route [editUrl] not defined错误,主要是路由命名使用错误,同时还存在控制器方法职责混淆、AJAX请求方式不对的问题,下面一步步来修正:

1. 核心问题梳理

  • 路由命名错误:Laravel资源路由自动生成的编辑路由名称是peoples.edit,而非你自定义的editUrl;且JS中直接拼接路由的写法不符合Laravel规范。
  • 控制器职责混淆:资源控制器的edit方法负责获取编辑数据,更新逻辑应该放在update方法中,你把更新代码写到了edit里,违背了资源控制器的设计逻辑。
  • 请求方式错误:更新操作应该用PUT/PATCH请求,而非GET。

修正后的代码示例

1. 修正Blade视图的AJAX逻辑

把更新操作的JS代码替换为以下内容:

$(document).on('click', '#UpdateForm', function () {
    let name = $('#name').val();
    let country = $('#country').val();
    let address = $('#address').val();
    let id = $(this).data('id');
    
    // 构造资源路由的更新URL,使用PUT请求
    $.ajax({
        url: "{{ url('peoples') }}/" + id,
        type: 'PUT',
        data: {
            name: name,
            country: country,
            address: address
        },
        success: function (data) {
            console.log('更新成功');
            // 成功后重置表单并切换显示状态
            $('#name').val('');
            $('#country').val('');
            $('#address').val('');
            $("#FormAjax").hide();
            $("#ShowAjax").fadeIn();
            // 这里可以添加刷新数据列表的逻辑
        },
        error: function(xhr) {
            console.log('更新失败:', xhr.responseText);
        }
    });
});

如果想更安全地使用路由生成器,可以这样写:

$(document).on('click', '#UpdateForm', function () {
    // ...其他变量定义
    let id = $(this).data('id');
    // 生成带占位符的更新路由,再替换为实际ID
    let baseUpdateUrl = "{{ route('peoples.update', ':id') }}";
    let updateUrl = baseUpdateUrl.replace(':id', id);
    
    $.ajax({
        url: updateUrl,
        type: 'PUT',
        // ...其他参数
    });
});

2. 修正PeopleController.php

拆分edit和update方法,明确各自职责:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\People; // 确保引入你的模型

class PeopleController extends Controller
{
    // 获取要编辑的人员数据(AJAX请求返回JSON)
    public function edit(People $people)
    {
        if(request()->ajax()) {
            return response()->json($people);
        }
        // 非AJAX请求返回编辑视图(如果有需求的话)
        return view('peoples.edit', compact('people'));
    }

    // 处理人员数据更新
    public function update(Request $request, People $people)
    {
        if($request->ajax()) {
            // 验证请求数据
            $request->validate([
                'name' => 'required',
                'address' => 'required',
                'country' => 'required',
            ]);

            // 更新模型数据
            $people->update($request->only(['name', 'address', 'country']));
            
            return response()->json(['message' => '更新成功']);
        }
    }
}

3. 路由文件无需修改

你的routes/web.php中的资源路由是正确的:

Route::resource('peoples', 'PeopleController');

额外注意事项

  • 原代码中edit方法未注入Request实例,会导致报错,修正后的代码已解决此问题。
  • 资源路由的update方法默认只接受PUT/PATCH请求,AJAX必须使用对应请求类型。
  • 建议保留error回调,方便调试请求失败的情况。

内容的提问来源于stack exchange,提问作者user9718779

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:47:24