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
相关产品推荐
相关产品推荐

