如何在选项卡内的ActiveAdmin的显示页面上添加可排序表?

时间:2016-03-23 16:34:08

标签: ruby-on-rails activeadmin

请考虑以下情形:我在index中有showActiveAdmin页面的资源,在展示页面上我有更多Tabs

example picture showing four tabs in resource show page

Tabs中的一些(可能不止一个)中,我希望以表格形式显示与资源相关的信息,并使用可排序的列。 我还要求应用程序在更改表的排序顺序时保持选定的Tab

如何在ActiveAdmin中实现这一目标?

2 个答案:

答案 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 指向该表格):

Example sortable table in Tab

答案 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