使用 ajax 和 rails 将多个参数保存在单个数组中

Posted

技术标签:

【中文标题】使用 ajax 和 rails 将多个参数保存在单个数组中【英文标题】:Saving multiple params in a single array with ajax and rails 【发布时间】:2017-12-12 10:54:10 【问题描述】:

当一张卡片被拖入列表时,我使用jQueryUI sortable 插件的update 回调将每张卡片的新位置发送到我的控制器。此 AJAX 请求会在释放拖动卡片的列表中发布每张卡片的 position 属性。

$(".js-Sortable").sortable(
    connectWith: ".js-Sortable",
    items: ".js-CardContainer",
    update: function( event, ui ) 
        if (this === ui.item.parent()[0]) 

            var data = $(this).sortable('serialize');

            $.ajax(
                url: "/c/sort",
                type: "POST",
                dataType: "script",
                data: data,
                success: function(resp)
                    console.log('Yay');
                
            );
        
    
);

这会发送看起来像这样的参数

Parameters: "card"=>["39", "2", "1", "6", "40", "5", "18", "3", "16", "7", "17", "8", "15", "9", "10", "11", "12", "13", "14", "4"]

然后,我将在我的控制器操作中更新每个受影响卡的 position 属性,如下所示:

def sort
    params[:card].each_with_index do |id, index|
        card = Card.find(id)
        card.update_attribute(:position, index) if card
    end

    head :ok
end

视图如下所示:

<ul class="js-CardsContainer js-Sortable">
  <% list.cards.order(:position).where(archived: false).each do |card| %>
    <li class="js-CardContainer" id="card-<%= card.id %>">
      <%= link_to card, class: 'js-Card', :data =>  :id => card.id , remote: true do %>
        <span><%= card.title %></span>
      <% end %>
    </li>
  <% end %>
</ul>

到目前为止,这一切都有效。问题是,卡片可以在不同的列表中移动。所以,我需要以某种方式获取被拖动的卡片被释放到的列表中的id,并将其与 AJAX 请求一起发布。

我可以将list_id 作为变量获取,但是如何将list_id 添加到 AJAX 请求中的数组中?

【问题讨论】:

你能暴露 DOM 吗? 我的意思是展示你的观点 你可以在datahash中传递list_id 会晚点讨论,我现在很忙,我会尽量解决你的问题 &lt;%= link_to card, class: 'js-Card', :data =&gt; :id =&gt; card.id,list_id:list.id , remote: true do %&gt; &lt;span&gt;&lt;%= card.title %&gt;&lt;/span&gt; &lt;% end %&gt; 试试这个让我 【参考方案1】:

根据您的问题,您将收到 cards_id 并且您想将 list_id 连同它一起传递

在你的 DOM 中你需要先添加 list_id

<%= link_to card, class: 'js-Card', :data =>  :id => card.id , remote: true,"data-list-id":list.id do %>
        <span><%= card.title %></span> <% end %>

现在您需要在事件处理程序中获取此列表 ID 并将其与您的 cards_id 参数结合起来

$(".js-Sortable").sortable(
    connectWith: ".js-Sortable",
    items: ".js-CardContainer",
    update: function( event, ui ) 
        if (this === ui.item.parent()[0]) 
            var data = 
            var data['cards_id'] = $(this).sortable('serialize');
            var data['list_id'] = $(this).attr("data-list-id")
            $.ajax(
                url: "/c/sort",
                type: "POST",
                dataType: "script",
                data: data,
                success: function(resp)
                    console.log('Yay');
                
            );
        
    
);

在您的控制器排序操作中,您需要遵循此代码

params[:card].each_with_index do |id, index, list_id| 
card = Card.find(id) 
card.update(:position => index, 
:list_id => params[:ListId]) 
end

希望对你有帮助

【讨论】:

【参考方案2】:

抱歉,我迟到了回复。要基于@uzaif 的答案,您还可以像这样在数据哈希本身内设置键值对:

 var data = $(this).sortable('serialize'), list_id: $(this).attr("data-list-id")

就像@uzaif 所说,确保调整您的控制器以接受参数哈希中的 list_id。

【讨论】:

【参考方案3】:

正如我在上一条评论中提到的,在排序等事件(以及在其他 jquery UI 事件中,如可拖动)上发送的至少一个对象通常包含对前一个元素的引用。

在这种情况下,ui 对象包含一个发送者数组,该数组将在索引 0 处包含对最近发送者的引用:ui.sender[0]

我在这里举了一个例子来说明如何在你的情况下使用它:

http://jsfiddle.net/6npx24uf/

【讨论】:

谢谢米克。实际上,我在将该变量与我的 AJAX 请求中的其他数据组合时遇到了麻烦,然后在我的 rails 控制器操作中传递了该数据。我已经有了我需要的变量。不过感谢您的指点,我可以将该事件数据用于其他用途。

以上是关于使用 ajax 和 rails 将多个参数保存在单个数组中的主要内容,如果未能解决你的问题,请参考以下文章

rails 6中没有针对多个路线参数的路线匹配

在rails应用程序中通过ajax请求将参数传递给控制器

如何使用 jquery 和 Ajax 将多个文件字段保存到 django

示例 - Ruby on Rails 6/7 的 Select2 多个 AJAX 代码(没有 Gem)

Rails 6嵌套形式茧不会保存子对象

Rails 4 引发 ArgumentError(参数数量错误(2 对 1)):通过 AJAX POST 更新时