求助:使用Ajax与CKEditor5提交数据无法存入Laravel数据库
问题分析与解决方案
1. 阻止表单默认提交行为(页面刷新的核心原因)
你的按钮是type="submit",点击时会触发表单的默认提交动作,直接导致页面刷新,Ajax请求被中断。必须在点击事件里阻止这个默认行为:
修改JS代码:
$(document).ready(function(){ $("#btn").click(function(event){ // 阻止表单默认提交动作 event.preventDefault(); // 正确获取CKEditor5的编辑内容 const editor = CKEDITOR.instances.editor; const content = editor.getData(); $.ajax({ type: 'post', url: "{{ route('sendcom') }}", data: { content: content }, headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, // 新增回调方便调试 success: function(res) { console.log(res); alert('保存成功'); }, error: function(xhr) { console.error(xhr.responseText); alert('保存失败,请查看控制台日志'); } }); }); });
2. 正确获取CKEditor5内容
CKEditor5会替换原生textarea,直接用$('#editor').val()无法获取编辑器实时内容,必须通过CKEditor实例获取:
- 确保已正确初始化CKEditor:
ClassicEditor .create(document.querySelector('#editor')) .then(editor => { console.log('编辑器初始化完成'); }) .catch(err => { console.error(err); });
- 之后用
editor.getData()获取内容,如上述JS代码所示。
3. 修正控制器updateOrCreate逻辑
updateOrCreate的正确用法是updateOrCreate(查询条件数组, 要更新/创建的数据数组)。你当前只传了一个数组,相当于用contract = $content作为条件查找用户,找不到就创建仅含contract字段的记录——如果User模型有其他必填字段(如name、email),会直接触发数据库报错。
假设你要更新当前登录用户的contract字段,修改控制器代码:
public function sendcom(Request $request){ // 可选:验证输入数据 $request->validate([ 'content' => 'required', ]); // 获取当前登录用户 $user = auth()->user(); // 更新用户的contract字段 $user->update([ 'contract' => $request->content ]); // 若需按条件创建/更新(比如指定用户标识),可改用: // User::updateOrCreate( // ['id' => $user->id], // 查询条件:匹配当前用户ID // ['contract' => $request->content] // 要更新的数据 // ); return response(['success' => '合同保存成功。']); }
4. 调试建议
- 打开浏览器控制台(F12),切换到Network标签,确认Ajax请求是否发送成功、响应内容是否正常。
- 查看Laravel日志文件(
storage/logs/laravel.log),排查是否有数据库或业务逻辑报错。 - 可在控制器开头添加
dd($request->all());,先确认是否接收到前端发送的数据。
内容的提问来源于stack exchange,提问作者ParsaSHahabdi
相关产品推荐
相关产品推荐

