请考虑以下情形:我在index
中有show
和ActiveAdmin
页面的资源,在展示页面上我有更多Tabs
。
在Tabs
中的一些(可能不止一个)中,我希望以表格形式显示与资源相关的信息,并使用可排序的列。
我还要求应用程序在更改表的排序顺序时保持选定的Tab
。
如何在ActiveAdmin
中实现这一目标?
答案 0 :(得分:4)
不幸的是,ActiveAdmin似乎不支持这种开箱即用的功能,但它可以实现。
在ActiveAdmin.register
调用中(通常位于lib/admin/resource.rb
),这会为resource
的{{1}}数据创建一个表格:
some_connection
不幸的是,这不是一个可排序的表,所以我们应该简单地添加以下选项hash:
tab "Tab 2" do
table_for resource.some_connection do
column :name
...
end
end
像这样:
{:sortable => true, :class => 'index_table'}
嗯,这几乎可以奏效。不幸的是,选择排序列会将您带回第一个table_for resource.some_connection, {:sortable => true, :class => 'index_table'} do
,但排序将存储在网址中(采用Tab
格式)。
要解决此问题,我使用以下内容修补了whatever/your/page/address/is?order=name_asc
ActiveAdmin's
课程:
TableFor
基本上我在选项中添加了一个锚参数,使用它我们可以在选择排序条件后返回表所在的选项卡。这些条件的名称是使用此锚作为前缀扩展的,因此在不同的选项卡中具有相同名称的列不会弄乱不同表的排序。 (目前我使用锚作为前缀,但可以将其更改为完全独立的选项参数,以在一个module ActiveAdmin
module Views
class TableFor
def build(obj, *attrs)
options = attrs.extract_options!
@sortable = options.delete(:sortable)
@collection = obj.respond_to?(:each) && !obj.is_a?(Hash) ? obj : [obj]
@resource_class = options.delete(:i18n)
@resource_class ||= @collection.klass if @collection.respond_to? :klass
@columns = []
@row_class = options.delete(:row_class)
@anchor = options.delete(:anchor)
@sort_key_prefix = ''
@sort_key_prefix = @anchor.to_s + '_' unless @anchor.nil?
build_table
super(options)
columns(*attrs)
end
def build_table_header(col)
classes = Arbre::HTML::ClassList.new
sort_key = sortable? && col.sortable? && col.sort_key
params = request.query_parameters.except :page, :order, :commit, :format
classes << 'sortable' if sort_key
classes << "sorted-#{current_sort[1]}" if sort_key && current_sort[0] == @sort_key_prefix + sort_key
classes << col.html_class
if sort_key
th class: classes do
link_to col.pretty_title, params: params, order: "#{@sort_key_prefix}#{sort_key}_#{order_for_sort_key(@sort_key_prefix + sort_key)}", anchor: @anchor
end
else
th col.pretty_title, class: classes
end
end
end
end
end
中支持更多表格)
我使用初始化程序加载猴子补丁,它只需要包含上面代码的文件:
Tab
这些更改要求我们稍微修改构建表格的方式(我们必须从monkey_patches.rb
-----------------
require 'ext/active_admin/views/table_for'
检索排序设置并将它们应用于我们的数据):
params
这是结果(此处表格实际上放在Panel
中,而tab_name = "Tab 2"
tab tab_name do
tab_anchor = tab_name.parameterize('_')
data = resource.some_conection
unless params['order'].nil?
order = params['order'].to_s.sub(tab_anchor + '_', '').sub("_asc", " ASC").sub("_desc", " DESC")
data = data.order(order) unless order.nil?
end
table_for data, { anchor: tab_anchor, :sortable => true, :class => 'index_table'} do
column :name
...
end
end
指向该表格):
答案 1 :(得分:0)
实际上,ActiveAdmin确实支持这一点。
要对表进行排序,请调用order()
方法并传递列名和desc/asc
,如do:
table_for boat.bookings.order('created_at desc') do
column :name
column :created_at
end
感谢赖安·贝茨(Ryan Bates)的截屏视频:http://railscasts.com/episodes/284-active-admin?view=asciicast