加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Rails中创建可拖动可排序列表的最有效方法是

发布时间:2020-12-17 03:29:24 所属栏目:百科 来源:网络整理
导读:我想创建可拖动的有序列表但是根据 this blog,acts_as_lists gem是服务器密集型的,它也说构建失败.他们建议排名模型宝石,但它似乎被弃用. 那么,当有许多用户重新排列列表时,最有效的方法是在不造成服务器上的巨大负载的情况下执行此操作. 解决方法 我用 HTML
我想创建可拖动的有序列表但是根据 this blog,acts_as_lists gem是服务器密集型的,它也说构建失败.他们建议排名模型宝石,但它似乎被弃用.

那么,当有许多用户重新排列列表时,最有效的方法是在不造成服务器上的巨大负载的情况下执行此操作.

解决方法

我用 HTML5 Sortable jQuery Plugin.

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

首先,有一个排序视图(路由是获取’items / sort’)供用户进行可拖动排序.它看起来像这样(纤细的格式):

div#items-sortable
  - @items.each do |item|
    = div_for item,data: {id: item.id}
      = item.title
      hr

= form_tag action: :ordering do
  = hidden_field_tag :items_ids,""
  = submit_tag 'Save Changes'

表单是保留排序数组并允许将数据发布到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)
    )

当用户进行排序时,它会通过项目ID的排序来更新表单的隐藏字段.

排序完成后,用户单击“保存更改”按钮,将其发布到使用item_ids参数的路径项目/订购.控制器中的方法如下所示:

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进行转换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读