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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:22:51