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

Laravel中如何通过两个按钮实现保存并跳转至不同页面?

问题排查与解决方案

我来帮你梳理下问题根源,同时给出优化后的修复方案:你的代码出现空白页且数据未保存,主要是缺少默认分支处理导致无响应返回,另外重复代码也容易隐藏错误,还有需要确保Session中的关联ID有效。

1. 核心问题修复:添加Switch默认分支

当submitbutton参数未正常传递或值不匹配时,控制器没有返回任何响应,直接导致空白页。必须给switch添加default分支处理这种异常情况:

switch($request->submitbutton) {
    // ... 原有case逻辑
    default:
        return redirect()->back()->with('error', '无效的提交操作,请重试');
}

2. 优化代码:抽离重复的保存逻辑

两个case里的保存代码完全重复,不仅冗余,还容易在修改时漏改。把通用逻辑抽出来,让代码更简洁易维护:

public function store(StoreExamQuestionsRequest $request) { 
    if (! Gate::allows('exam_question_create')) { 
        return abort(401); 
    }

    // 先检查Session中的考试ID是否存在,避免关联失败
    $examId = session()->get('id');
    if(!$examId) {
        return redirect()->back()->with('error', '未找到关联的考试信息,请重新进入');
    }

    try {
        // 通用保存逻辑:处理文件+创建问题
        $request = $this->saveFiles($request); 
        $question = ExamQuestion::create([
            'question' => $request->question,
            'exam_id' => $examId,
            'score' => $request->score,
            'question_image' => $request->question_image
        ]);

        // 批量保存选项
        for ($q = 1; $q <= 4; $q++) { 
            $optionText = $request->input('text_' . $q, ''); 
            if (!empty($optionText)) { 
                ExamOption::create([ 
                    'exam_question_id' => $question->id, 
                    'text' => $optionText, 
                    'is_correct' => $request->input('is_correct_' .$q, false) // 给默认值避免null
                ]); 
            } 
        }

        // 根据按钮类型跳转
        switch($request->submitbutton) { 
            case 'save': 
                return redirect()->route('admin.exam_questions.create')->with('success', '问题添加成功,继续添加'); 
            case 'save-done': 
                return redirect()->route('admin.exam_questions.index')->with('success', '所有问题添加完成'); 
            default:
                return redirect()->back()->with('error', '无效的提交操作,请重试');
        }
    } catch (\Exception $e) {
        // 捕获异常,方便调试排查问题
        return redirect()->back()->with('error', '保存失败:'.$e->getMessage());
    }
}

3. 额外检查项

  • 确认StoreExamQuestionsRequest已验证所有必填字段(比如question、score),Laravel会自动在验证失败时重定向回表单并携带错误提示。
  • 检查saveFiles方法是否正确处理了文件上传,确保返回的是有效的请求实例。
  • 你的表单按钮代码是正确的,但要确认表单的action指向了当前控制器的store路由,且请求方法为POST(Laravel Collective的Form组件默认会处理这一点)。

内容的提问来源于stack exchange,提问作者Simona Buga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:41:59