有时我们需要重新排序资源,acts_as_list对此任务非常有用。我的问题是: 在ActiveAdmin框架中实施某些资源重新排序的最佳方法是什么。
我知道没有“最好的方法”,但我想所有的回复都是受欢迎的,所以人们将能够找到这类问题的所有答案。
我自己写下了一个可能的解决方案,它使用jquery with drag& drop,但不使用过滤器,范围和排序。也许有理由为拖放重新排序专门设置单独的视图,或者有人用复选框,按钮等完成了不同的UI ...
请分享!
答案 0 :(得分: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_at
和move_to_bottom
方法。
此外我添加了repaintTable
,因此奇数行和偶数行在切换后仍然有不同的颜色,我在ajax请求完成后调用它。
function repaintTable()
{
$("#shows tr").removeClass('even odd');
$("#shows tr").filter(":odd").addClass('odd');
$("#shows tr").filter(":even").addClass('even');
}
缺点是它在范围,过滤器和某些列的排序方面都很糟糕。