Laravel表单Ajax更新报错:Creating default object from empty value求助
解决 "Creating default object from empty value" 错误及Ajax提交失败问题
我帮你一步步排查问题,这个错误本质是你尝试给一个null对象赋值属性导致的,结合你的代码来看,主要有几个关键问题需要修正:
1. 核心问题:传递的ID无法找到对应的Profile实例
你的控制器用Profile::find($usr_id)获取模型,但Ajax里传递的ID不对:
- 你在脚本里取的是
$('#emp_id').val(),但如果你的Profile模型主键是默认的id(而非emp_id),这个值根本不是Profile的主键,find()会返回null,后续给$profile->first_name赋值自然会报错。 - 表单里的隐藏字段
<input type="hidden" name="usr_id" id="usr_id">也没赋值,明显是混淆了ID参数。
修正:
先在表单里添加正确的Profile主键隐藏字段:
<input type="hidden" name="usr_id" id="usr_id" value="{{ $profile->id }}">
然后把Ajax里的ID获取改成:
var usr_id = $('#usr_id').val();
2. 表单输入框缺少name属性
你表单里的first_name和last_name只有id,没有name属性:
<input type="text" class="form-control" id="first_name" value="{{$profile->first_name}}" placeholder="First Name">
$('#editProfile').serialize()只会收集带name属性的字段值,控制器里$request->input('first_name')根本拿不到数据。
修正:给输入框补上name属性:
<input type="text" class="form-control" id="first_name" name="first_name" value="{{$profile->first_name}}" placeholder="First Name"> <input type="text" class="form-control" id="last_name" name="last_name" value="{{$profile->last_name}}" placeholder="Last Name">
3. Ajax配置错误:dataType和data搞混了
你在Ajax里写错了参数:
dataType: $('#editProfile').serialize(),
dataType是用来指定预期的服务器响应类型(比如json),而提交的数据应该用data参数。
修正:
$.ajax({ type: "PUT", url: "/profile/edit/" + usr_id, data: $('#editProfile').serialize(), // 这里改成data dataType: 'json', // 可选,根据你的响应类型设置 success: function (response) { console.log(response); alert("Data Updated"); // 可以不用强制刷新页面,直接更新页面显示的内容更友好 // location.reload(); }, error:function(error){ console.log(error); } });
4. 控制器代码优化(可选但推荐)
为了避免后续踩坑,可以给控制器加个实例判断,或者用findOrFail()直接抛出404错误,同时用save()更符合单实例更新的场景:
public function update(Request $request, $usr_id) { // 找不到实例直接抛出404,更直观 $profile = Profile::findOrFail($usr_id); $profile->first_name = $request->input('first_name'); $profile->last_name = $request->input('last_name'); $profile->save(); // 返回JSON响应给Ajax return response()->json(['success' => 'Profile updated successfully']); }
按照上面的步骤修正后,你的Ajax提交应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Supunsam
相关产品推荐
相关产品推荐

