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

点击删除时如何将产品与服务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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:26:49