通过单个 AJAX 请求同时保存多条记录?

Save Multiple Records Simultaneously with a single AJAX request?

我正在使用 jQuery Sortable 在列表之间拖动卡片,例如 Trello。当用户完成与卡片的交互后,我需要将所有卡片保存在该列表中。

我目前正在使用 each 循环执行此操作,遍历该类型的所有项目并使用 AJAX 请求保存每个项目。

ui.item.parent('.js-CardsContainer').children('.js-CardContainer').each(function() {
  var list_id = $(this).closest('.js-List').data('id');
  var order = $(this).index();
  var id = $(this).find('.js-Card').data('id');

  console.log(order);

  $.ajax({
    url: "/cards/" + id,
    type: "PATCH",
    data: {
      card: {
        list_id: list_id,
        order: order
      }
    },
    success: function(resp) {
      //
    }
  });
});

它似乎适用于只有几张卡片的列表。但是当保存 5 张以上的卡片时,其中一些会失败。我想那是因为每张卡都使用了单独的 AJAX 请求?

所以,我想我需要将所有 AJAX 请求合并为一个请求?我不知道该怎么做。有人可以帮忙吗?

这将执行我的控制器更新操作,如下所示

def update
    @card = Card.find(params[:id])

    if @card.update_attributes(shared_params)
        respond_to do |format|
            format.js   {}
            format.json { render json: @card, status: :created, location: @card }
        end
    else
        render :edit
    end
end

您可以更改您的逻辑,以便为 data 提供一个包含 card 个对象的数组,如下所示:

var cards = ui.item.parent('.js-CardsContainer .js-CardContainer').map(function() {
    return {
        list_id: $(this).closest('.js-List').data('id'),
        order: $(this).index
    }
}).get();

$.ajax({
    url: "/cards/",
    type: "PATCH",
    data: { cards: cards },
    success: function(resp){
        //
    }
});

然后您只需修改您的服务器端逻辑来处理卡片数组而不是单个实例。