点击删除时如何将产品与服务ID以数组形式传入表单隐藏字段?
解决多ID删除时的数组传递问题
你的问题核心在于当前代码每次删除都会覆盖隐藏字段的值,导致只能保留最后一个被删除的ID。要实现多ID的数组传递,我们需要维护一个数组来记录所有待删除的ID,再将数组更新到隐藏字段中,具体步骤如下:
1. 修正ERB中的ID传递(先确保传对要删除的ID)
先看你的ERB代码,onclick里传递的service_appointment.id应该是要删除的产品/服务的ID(也就是sao.operation.id),不然删除的是整个预约而不是单个服务/产品:
<% @service_appointment_operation.each do |sao| %> <tr style="color: #e06d6d;" data-tt-parent-id="ser_<%= @service_appointment.id %>" data-tt-id="ser_<%= @service_appointment.id %>_<%= sao.operation.id %>"> <td> <span class="glyphicon glyphicon-trash" onclick="deleteRow(<%= sao.operation.id %>,'<%= sao.operation_type %>')"> </span> </td> </tr> <% end %>
2. 修改JavaScript逻辑,维护待删除ID数组
我们需要定义两个全局数组来分别存储待删除的服务和产品ID,每次点击删除时将ID加入对应数组(同时避免重复添加),再把数组转换为字符串存入隐藏字段:
// 全局维护待删除的ID数组 let deletedServiceIds = []; let deletedProductIds = []; function deleteRow(id, type) { // 根据类型选择对应的数组 let targetArray = type === "Service" ? deletedServiceIds : deletedProductIds; // 避免重复添加同一个ID if (!targetArray.includes(id)) { targetArray.push(id); } // 将数组转换为逗号分隔的字符串,存入对应的隐藏字段 // Rails后端会自动把逗号分隔的字符串解析为数组(或者你也可以用JSON.stringify,后端再解析) if (type === "Service") { $('#deleted_service_ids').val(deletedServiceIds.join(',')); } else { $('#deleted_product_ids').val(deletedProductIds.join(',')); } }
3. 调整隐藏字段的定义
因为我们现在用单个字段存储逗号分隔的ID字符串,所以需要去掉字段名后的[](或者保留,Rails都会正确解析),同时确保ID唯一:
<%= hidden_field_tag "deleted_service_ids", "", id: "deleted_service_ids" %> <%= hidden_field_tag "deleted_product_ids", "", id: "deleted_product_ids" %>
如果你想保持[]的写法也没问题,Rails会把逗号分隔的字符串自动转为数组参数。
4. 可选:用动态添加隐藏字段的更优雅方式
如果你不想维护数组,也可以每次点击删除时动态添加一个新的同名隐藏字段,让表单原生支持数组提交,Rails会自动把多个同名参数解析为数组:
function deleteRow(id, type) { let fieldName = type === "Service" ? "deleted_service_ids[]" : "deleted_product_ids[]"; // 先检查是否已经添加过这个ID的字段,避免重复 if (!$(`input[name="${fieldName}"][value="${id}"]`).length) { // 动态创建隐藏字段并添加到表单中 $('<input>').attr({ type: 'hidden', name: fieldName, value: id }).appendTo('form'); } }
这种方式不需要修改原来的隐藏字段定义,甚至可以去掉初始的空隐藏字段,更贴合表单提交数组的原生逻辑。
后端接收参数(补充说明)
在Rails控制器中,你可以直接处理数组形式的参数:
# 获取待删除的服务ID数组 deleted_service_ids = params[:deleted_service_ids].split(',') if params[:deleted_service_ids].present? # 获取待删除的产品ID数组 deleted_product_ids = params[:deleted_product_ids].split(',') if params[:deleted_product_ids].present? # 执行删除操作 Service.where(id: deleted_service_ids).destroy_all Product.where(id: deleted_product_ids).destroy_all
如果用动态添加字段的方式,直接用params[:deleted_service_ids]就能拿到数组,不需要额外拆分。
内容的提问来源于stack exchange,提问作者SkRoR
相关产品推荐
相关产品推荐

