2012-07-21 130 views
2

有時我們需要重新排列我們的資源,acts_as_list對於此任務非常有用。我的問題是: 在ActiveAdmin框架中實施某些資源重新排序的最佳方式是什麼?在ActiveAdmin中重新排序

我知道沒有「最好的辦法」,但我想所有的答覆都是受歡迎的,所以人們能夠爲這類問題找到各種答案。


我寫下來的可能的解決方案的一個自己,它使用與拖&下降jQuery的,但不帶過濾器,工作範圍和排序。也許有一個理由,以獨立的視圖拖動&下降重新排序,或者也許有人做了與複選框,按鈕等不同的UI ...

請分享!

回答

2

其中一個解決方案在Sortable lists with acts_as_list and 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_list的insert_atmove_to_bottom方法。

另外我添加了一個repaintTable,所以奇數行和偶數行在開關後仍然有不同的顏色,我在ajax請求完成後調用它。

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

缺點是,它對作用域,過濾器和某些列進行排序時效果不佳。