2

有时我们需要重新排序资源,acts_as_list对这项任务非常有用。我的问题是:在ActiveAdmin框架中实现某些资源重新排序的最佳方法是什么。

我知道没有“最好的方法”,但我想欢迎所有回复,这样人们就可以找到这类问题的各种答案。


我自己写下了一种可能的解决方案,它使用带有拖放功能的 jquery,但不适用于过滤器、范围和排序。也许有理由专门为拖放重新排序使用单独的视图,或者可能有人使用复选框、按钮等制作了不同的 UI……</p>

请分享!

4

1 回答 1

2

使用acts_as_list 和ActiveAdmin 的可排序列表中描述了其中一种解决方案。解决方案非常好,我自己可以添加的只是一些不同的序列化函数和一些更美观的东西:

首先,我认为将所需资源移动到指定位置而不是移动它之后的所有资源会更有效。这是我更新的update功能:

$("#shows tbody").sortable({
  update: function(event, ui){
    var request
    if (ui.item.next().length == 0)
      request = {method: 'move_to_bottom', target: ui.item.find("span.show").data("id")}
    else
      request = {method: 'put_at_index', data: ui.item.next().find("span.show").data("id"), target: ui.item.find("span.show").data("id")}
    $.ajax({
      url: "/admin/shows/sort",
      type: 'post',
      headers: {
            'X-Transaction': 'sort shows',
            'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
          },
      data: request,
      complete: function(){
        $(".paginated_collection").effect("highlight");
        repaintTable();
      }
    });
  }
});

如您所见,我要么发送一个put_at_index方法,其中包含要放置的数据和项目的索引(实际上是我们拖动的项目下方的项目),如果它被拖到列表的底部,并且下面没有任何内容(之后)然后我只是发送一个move_to_bottom方法,其中包含要移动到底部的数据。

动作也被sort改变了,现在像这样工作:

collection_action :sort, :method => :post do
  case params[:method]
    when 'move_to_bottom'
      Show.find(params[:target]).move_to_bottom
    when 'put_at_index'
      Show.find(params[:target]).insert_at(Show.find(params[:data]).position)
  end
  head 200
end

所以它只是使用acts_as_listinsert_atmove_to_bottom方法。

我还添加了一个repaintTable,所以奇数行和偶数行在切换后仍然有不同的颜色,我在 ajax 请求完成后调用它。

function repaintTable()
{
  $("#shows tr").removeClass('even odd');
  $("#shows tr").filter(":odd").addClass('odd');
  $("#shows tr").filter(":even").addClass('even');
}

缺点是它不适用于范围、过滤器和按某些列排序。

于 2012-07-21T16:48:26.730 回答