Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中创建可拖动可排序列表的最有效方法是什么?_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 在Rails中创建可拖动可排序列表的最有效方法是什么?

Ruby on rails 在Rails中创建可拖动可排序列表的最有效方法是什么?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我想创建可拖动的有序列表,但根据acts_as_lists,gem是非常服务器密集型的,它还表示构建失败。他们建议使用排名模型gem,但它似乎已被弃用 那么,当有许多用户重新排列列表时,在不造成服务器巨大负载的情况下,最有效的方法是什么呢 对于每个项目,都有一个排序字段来指定排序(1到n)。一旦用户完成了可拖动排序,排序将以数组形式发布到Rails后端,例如[1、5、3、6、2、4]。数组中的数字是项目的id。基于此数组,我可以更新排序字段。例如,数组中的第一项(id=1)的顺序为1,第二项(i

我想创建可拖动的有序列表,但根据acts_as_lists,gem是非常服务器密集型的,它还表示构建失败。他们建议使用排名模型gem,但它似乎已被弃用

那么,当有许多用户重新排列列表时,在不造成服务器巨大负载的情况下,最有效的方法是什么呢

对于每个项目,都有一个排序字段来指定排序(1到n)。一旦用户完成了可拖动排序,排序将以数组形式发布到Rails后端,例如[1、5、3、6、2、4]。数组中的数字是项目的id。基于此数组,我可以更新排序字段。例如,数组中的第一项(id=1)的顺序为1,第二项(id=5)的顺序为2。稍后,您可以使用订购(“订购ASC”)进行订购

首先,有一个排序视图(路径为“获取项目/排序”),供用户进行可拖动排序。它看起来像这样(以超薄格式):

表单用于保留排序数组,并允许将数据发布到Rails

Javascript(CoffeeScript)如下所示:

sortable_element = document.getElementById('items-sortable')
if sortable_element
  $(sortable_element).sortable({
    placeholder: "<div style='border-style: dashed'>&nbsp;&nbsp;&nbsp;</div>"
    })
    .bind('sortupdate', (e, ui) ->
      orders = ui.endparent.children().map( -> return $(this).data("id") ).toArray()
      document.getElementById('items_ids').value = JSON.stringify(orders)
    )
def ordering
  if (@orders = params[:items_ids]) && (@orders.present?)
    @orders = JSON.parse(params[:items_ids])
    if @orders.kind_of?(Array) && @orders.size > 0
      # Let build hash for mass update
      data = {}
      @orders.each_with_index do |iden, index|
        data[iden] = {ordering: index}
      end
      Item.all.update(data.keys, data.values) # still update one-by-one at backend
    end
  end
  respond_to do |format|
    format.html { redirect_to items_path }
  end
end

如果您不想使用表单,可以尝试使用AJAX对其进行转换。

您可以使用。这是我计划使用的,但我需要一种方法来更新数据库,我不确定如何有效地进行转换。就像这个rails cast用jQuery显示了acts_as_列表gem,但我想要一种更有效的方式,比如排名模型。jQuery拖放并强制用户在对列表的排列感到满意后单击保存按钮。这会起作用。你知道我在哪里能找到这方面的指南吗。我假设我会使用像rails那样的acts_as_列表,但我知道如何停止自动更新并强制用户以某种方式保存。
def ordering
  if (@orders = params[:items_ids]) && (@orders.present?)
    @orders = JSON.parse(params[:items_ids])
    if @orders.kind_of?(Array) && @orders.size > 0
      # Let build hash for mass update
      data = {}
      @orders.each_with_index do |iden, index|
        data[iden] = {ordering: index}
      end
      Item.all.update(data.keys, data.values) # still update one-by-one at backend
    end
  end
  respond_to do |format|
    format.html { redirect_to items_path }
  end
end