class ActiveAdmin::CSVBuilder

CSVBuilder stores CSV configuration

Usage example:

csv_builder = CSVBuilder.new
csv_builder.column :id
csv_builder.column("Name") { |resource| resource.full_name }
csv_builder.column(:name, humanize_name: false)
csv_builder.column("name", humanize_name: false) { |resource| resource.full_name }

csv_builder = CSVBuilder.new col_sep: ";"
csv_builder = CSVBuilder.new humanize_name: false
csv_builder.column :id

Constants

COLUMN_TRANSITIVE_OPTIONS

Attributes

columns[R]
options[R]
view_context[R]

Public Class Methods

default_for_resource(resource) click to toggle source

Return a default CSVBuilder for a resource The CSVBuilder’s columns would be Id followed by this resource’s content columns

# File lib/active_admin/csv_builder.rb, line 22
def self.default_for_resource(resource)
  new resource: resource do
    column :id
    resource.content_columns.each { |c| column c.name.to_sym }
  end
end
new(options={}, &block) click to toggle source
# File lib/active_admin/csv_builder.rb, line 33
def initialize(options={}, &block)
  @resource = options.delete(:resource)
  @columns, @options, @block = [], options, block
end

Public Instance Methods

build(controller, csv) click to toggle source
# File lib/active_admin/csv_builder.rb, line 42
def build(controller, csv)
  @collection  = controller.send :find_collection, except: :pagination
  columns      = exec_columns controller.view_context
  options      = ActiveAdmin.application.csv_options.merge self.options
  bom          = options.delete :byte_order_mark
  column_names = options.delete(:column_names) { true }
  csv_options  = options.except :encoding_options

  csv << bom if bom

  if column_names
    csv << CSV.generate_line(columns.map{ |c| encode c.name, options }, csv_options)
  end

  (1..paginated_collection.total_pages).each do |page|
    paginated_collection(page).each do |resource|
      resource = controller.send :apply_decorator, resource
      csv << CSV.generate_line(build_row(resource, columns, options), csv_options)
    end
  end

  csv
end
build_row(resource, columns, options) click to toggle source
# File lib/active_admin/csv_builder.rb, line 73
def build_row(resource, columns, options)
  columns.map do |column|
    encode call_method_or_proc_on(resource, column.data), options
  end
end
column(name, options={}, &block) click to toggle source
# File lib/active_admin/csv_builder.rb, line 38
def column(name, options={}, &block)
  @columns << Column.new(name, @resource, column_transitive_options.merge(options), block)
end
encode(content, options) click to toggle source
# File lib/active_admin/csv_builder.rb, line 79
def encode(content, options)
  if options[:encoding]
    content.to_s.encode options[:encoding], options[:encoding_options]
  else
    content
  end
end
exec_columns(view_context = nil) click to toggle source
# File lib/active_admin/csv_builder.rb, line 66
def exec_columns(view_context = nil)
  @view_context = view_context
  @columns = [] # we want to re-render these every instance
  instance_exec &@block if @block.present?
  columns
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/active_admin/csv_builder.rb, line 87
def method_missing(method, *args, &block)
  if @view_context.respond_to? method
    @view_context.public_send method, *args, &block
  else
    super
  end
end

Private Instance Methods

batch_size() click to toggle source
# File lib/active_admin/csv_builder.rb, line 125
def batch_size
  1000
end
column_transitive_options() click to toggle source
# File lib/active_admin/csv_builder.rb, line 117
def column_transitive_options
  @column_transitive_options ||= @options.slice(*COLUMN_TRANSITIVE_OPTIONS)
end
paginated_collection(page_no = 1) click to toggle source
# File lib/active_admin/csv_builder.rb, line 121
def paginated_collection(page_no = 1)
  @collection.public_send(Kaminari.config.page_method_name, page_no).per(batch_size)
end