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

Laravel中修复表单总取最后记录ID问题:jQuery传递记录ID到表单路由

问题解决思路

首先定位核心问题:

  • 你当前的编辑modal被嵌入在列表的循环渲染逻辑中,每遍历一条汇率记录就会重复生成一个id为edit_exchange_rate的modal元素。由于DOM规范不允许页面存在重复id的元素,最终生效的只有循环到最后一条记录时生成的modal实例,它的action属性自然被绑定为最后一条记录的更新路由,和其他行的点击操作完全脱钩。
  • 你写的编辑按钮本身已经正确通过data-*属性存储了每条记录的ID和业务字段,只需要把modal从循环里移出做全局单例,再通过JS动态更新表单的提交地址即可,不需要后端循环渲染重复的modal结构。
分步实现方案

1. 调整modal的放置位置

把之前写的编辑modal从列表的@foreach循环块中移出来,放到整个表格容器的末尾,全页只保留一份通用的modal结构。同时把表单action里硬编码的动态参数换成可替换的占位符,方便后续JS动态修改:

{{-- 全局只保留这一份编辑modal,不要放在循环里 --}}
<div id="edit_exchange_rate" class="modal fade">
    <div class="modal-dialog modal-sm">
        <div class="modal-content">
            <div class="p-2 modal-header bg-dark">
                <h6 class="modal-title">Edit exchange rate</h6>
            </div>

            {{-- action参数用占位符替换原来的动态id --}}
            <form  method="POST" id="edit_exchange_rate_form" 
                  action="{{ route('exchange_rate.update', ['id' => '__RECORD_ID__']) }}" 
                  class="modal-body"  enctype="multipart/form-data">
                @csrf
                @method('PATCH')
                <!-- 原有表单控件保持不变 -->
                <div class="form-group row">
                    <label for="from_edit" class="text-right col-md-4 col-form-label">From</label>
                    <div class="col-md-8">
                        <select name="from" class="form-control select select2-hidden-accessible" id="from_edit" data-fouc>
                            @foreach($currencies as $currency)
                                <option value="{{$currency->name}}">{{$currency->name}}</option>
                            @endforeach
                        </select>
                    </div>
                    @error('from')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                    @enderror
                </div>

                <div class="form-group row">
                    <label for="to_edit" class="text-right col-md-4 col-form-label">To</label>
                    <div class="col-md-8">
                        <select name="to" class="form-control select select2-hidden-accessible" id="to_edit"  data-fouc>
                            @foreach($currencies as $currency)
                                <option value="{{$currency->name}}">{{$currency->name}}</option>
                            @endforeach
                        </select>
                    </div>
                    @error('to')
                    <span class="invalid-feedback" role="alert">
                        <strong>{{ $message }}</strong>
                    </span>
                    @enderror
                </div>
              
                <button type="submit" class="float-right btn btn-light">Save changes</button>
            </form>
        </div>
    </div>
</div>

2. 调整jQuery逻辑,动态更新表单提交地址

在原来的填充表单值的逻辑基础上,新增读取当前行data-id、替换表单action的代码,不需要改动原有编辑按钮的结构:

function edit_exchange_rate(e) {
    const link = $(e);
    const modal = $('#edit_exchange_rate');
    // 读取当前点击行存储的所有数据
    const recordId = link.data('id');
    const from = link.data('from');
    const to = link.data('to');
    const rate = link.data('rate');
    const reverse = link.data('reverse');

    // 动态替换表单的提交地址,把占位符换成当前记录的ID
    const editForm = modal.find('#edit_exchange_rate_form');
    const baseAction = editForm.attr('action');
    editForm.attr('action', baseAction.replace('__RECORD_ID__', recordId));

    // 原有填充字段的逻辑保持不变
    modal.find('#from_edit').val(from).change();
    modal.find('#to_edit').val(to).change();
    modal.find('#rate_edit').val(rate).change();
    modal.find('#reverse_edit').val(reverse).change();
}
补充注意事项
  • 不要在循环块内生成带重复id的DOM元素,这类写法不仅会导致modal状态错位,还可能引发其他样式、事件绑定的异常问题。全页通用的modal做单例即可,所有业务数据都通过按钮上的data-*属性动态传入。
  • 如果觉得占位符替换不够直观,也可以直接拼接路由地址:比如后端更新路由的基础路径是/exchange_rate/,直接写editForm.attr('action', /exchange_rate/${recordId})即可。
  • 原有的编辑按钮代码逻辑是正确的,已经正确在data属性上存储了每条记录的完整数据,不需要做修改。

内容的提问来源于stack exchange,提问作者Mahdi Jafari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 16:15:07