有时我们需要重新排序我们的资源和 acts_as_list对于这项任务确实很有用。我的问题是: 实现 ActiveAdmin 中某些资源重新排序的最佳方法是什么?框架。
我知道没有“最好的方法”,但我想所有的回复都是受欢迎的,这样人们就能够找到此类问题的各种答案。
我自己写下了一种可能的解决方案,它使用 jquery 进行拖放,但不能使用过滤器、范围和排序。也许有理由专门为拖放重新排序提供单独的 View ,或者也许有人使用复选框、按钮等制作了不同的 UI...
请分享!
最佳答案
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');
}
缺点是它在范围、过滤器和按某些列排序方面效果不佳。
关于ruby-on-rails-3 - 在 ActiveAdmin 中重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594054/