Laravel Ajax更新单字段遇重定向过多问题求助
解决日程记录disabled_dates更新时的"too many redirects"问题
你的问题核心应该是Ajax请求的路由和原表单路由冲突了——原表单的PUT路由可能带有重定向逻辑,而你现在的Ajax请求直接指向了这个路由,导致每次请求都触发重定向,最终形成循环。下面是具体的解决方案:
1. 配置独立的路由处理日期添加
首先,给add_blocked_day方法配置一个独立的PUT路由,避免和原表单的更新路由混淆。在你的路由文件里添加:
Route::put('/schedule/add-blocked-day', [ScheduleController::class, 'add_blocked_day'])->name('schedule.add-blocked-day');
(注意替换ScheduleController::class为你实际的控制器类名)
2. 修正Ajax请求的URL
把disable()函数里的请求URL改成上面定义的新路由,这样就不会触发原表单的重定向逻辑了:
function disable() { var CSRF_TOKEN = '{{ csrf_token() }}'; var disabled_date = document.getElementById('disable_date').value; // 先校验日期是否为空,避免无效请求 if (!disabled_date) { alert('请选择要添加的日期'); return; } $.ajax({ type:'PUT', url:'{{ route('schedule.add-blocked-day') }}', // 使用命名路由更可靠 data:{_token: CSRF_TOKEN, blocked_date: disabled_date}, success:function(response) { console.log(response); // 成功后可以清空输入框,提升用户体验 document.getElementById('disable_date').value = ''; }, error:function(xhr) { console.error('添加失败:', xhr.responseText); } }); }
3. 优化控制器中日期数组的处理逻辑
你现在直接用逗号拼接字符串的方式容易出现问题(比如首次添加时会有前置逗号、重复日期无法过滤),建议把disabled_dates转成数组处理:
public function add_blocked_day(Request $request) { // 先校验请求参数 $request->validate([ 'blocked_date' => 'required|date', ]); $schedule = auth()->user()->schedule; // 将现有日期字符串转成数组(如果是空的就初始化空数组) $current_blocked_dates = $schedule->disabled_dates ? explode(',', $schedule->disabled_dates) : []; // 过滤重复日期 if (!in_array($request->blocked_date, $current_blocked_dates)) { $current_blocked_dates[] = $request->blocked_date; // 再转成字符串存回数据库 $schedule->disabled_dates = implode(',', $current_blocked_dates); $schedule->save(); } return response()->json(['status' => 'success', 'dates' => $current_blocked_dates]); }
如果你的disabled_dates字段是存JSON格式的(推荐),可以直接用json_decode和json_encode处理,会更规范。
4. 可选:给日期输入封装独立表单
虽然Ajax请求不需要表单,但如果你想更规范地组织代码,可以把输入框和按钮包在一个表单里(不过要阻止表单默认提交行为):
<form id="addDisabledDateForm" class='input-group text-center'> {!! Form::text('disabled_dates', null , ['class' => 'form-control text-center datetimepicker15', 'id' => 'disable_date', 'placeholder' => '选择要禁用的日期']) !!} <span class="input-group-btn"> <button type="submit" class="btn btn-fab btn-round btn-success"> <i class="material-icons">add</i> </button> </span> </form>
然后把onclick改成表单的submit事件监听,避免全局函数:
$('#addDisabledDateForm').submit(function(e) { e.preventDefault(); // 阻止表单默认提交 var CSRF_TOKEN = '{{ csrf_token() }}'; var disabled_date = $('#disable_date').val(); if (!disabled_date) { alert('请选择要添加的日期'); return; } $.ajax({ type:'PUT', url:'{{ route('schedule.add-blocked-day') }}', data:{_token: CSRF_TOKEN, blocked_date: disabled_date}, success:function(response) { console.log(response); $('#disable_date').val(''); }, error:function(xhr) { console.error('添加失败:', xhr.responseText); } }); });
这样调整后,请求会指向独立的路由,不会触发原表单的重定向逻辑,同时也优化了日期处理的健壮性。
内容的提问来源于stack exchange,提问作者Shawn Sonnier
相关产品推荐
相关产品推荐

