activeadmin 2.13.1 → 2.14.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activeadmin might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +58 -0
- data/CONTRIBUTING.md +3 -4
- data/README.md +2 -2
- data/app/assets/javascripts/active_admin/base.js +1 -4
- data/app/assets/stylesheets/active_admin/_forms.scss +1 -1
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +6 -1
- data/app/views/layouts/active_admin_logged_out.html.erb +5 -4
- data/config/locales/fr.yml +3 -3
- data/config/locales/vi.yml +34 -7
- data/config/locales/zh-CN.yml +36 -17
- data/lib/active_admin/asset_registration.rb +3 -3
- data/lib/active_admin/authorization_adapter.rb +2 -0
- data/lib/active_admin/base_controller/authorization.rb +2 -2
- data/lib/active_admin/dependency.rb +0 -4
- data/lib/active_admin/engine.rb +1 -1
- data/lib/active_admin/filters/resource_extension.rb +4 -4
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +1 -1
- data/lib/active_admin/orm/active_record/comments.rb +8 -8
- data/lib/active_admin/pundit_adapter.rb +0 -2
- data/lib/active_admin/resource/action_items.rb +2 -2
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_helpers/auto_link_helper.rb +1 -1
- data/lib/active_admin/views/index_as_table.rb +1 -1
- data/lib/active_admin/views/pages/base.rb +4 -3
- data/lib/active_admin/views/pages/index.rb +1 -1
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +17 -0
- metadata +5 -44
- data/docs/.gitignore +0 -1
- data/docs/0-installation.md +0 -142
- data/docs/1-general-configuration.md +0 -224
- data/docs/10-custom-pages.md +0 -150
- data/docs/11-decorators.md +0 -70
- data/docs/12-arbre-components.md +0 -214
- data/docs/13-authorization-adapter.md +0 -285
- data/docs/14-gotchas.md +0 -138
- data/docs/2-resource-customization.md +0 -475
- data/docs/3-index-pages/custom-index.md +0 -35
- data/docs/3-index-pages/index-as-block.md +0 -19
- data/docs/3-index-pages/index-as-blog.md +0 -69
- data/docs/3-index-pages/index-as-grid.md +0 -27
- data/docs/3-index-pages/index-as-table.md +0 -234
- data/docs/3-index-pages.md +0 -328
- data/docs/4-csv-format.md +0 -74
- data/docs/5-forms.md +0 -238
- data/docs/6-show-pages.md +0 -93
- data/docs/7-sidebars.md +0 -75
- data/docs/8-custom-actions.md +0 -177
- data/docs/9-batch-actions.md +0 -237
- data/docs/CNAME +0 -1
- data/docs/Gemfile +0 -4
- data/docs/Gemfile.lock +0 -283
- data/docs/README.md +0 -24
- data/docs/_config.yml +0 -4
- data/docs/_includes/footer.html +0 -8
- data/docs/_includes/google-analytics.html +0 -16
- data/docs/_includes/head.html +0 -7
- data/docs/_includes/toc.html +0 -98
- data/docs/_includes/top-menu.html +0 -17
- data/docs/_layouts/default.html +0 -21
- data/docs/documentation.md +0 -60
- data/docs/images/activeadmin.png +0 -0
- data/docs/images/code-header.png +0 -0
- data/docs/images/divider.png +0 -0
- data/docs/images/features.png +0 -0
- data/docs/images/tidelift.svg +0 -14
- data/docs/index.html +0 -226
- data/docs/stylesheets/main.css +0 -1205
@@ -1,234 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/3-index-pages/index-as-table.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Index as a Table
|
6
|
-
|
7
|
-
By default, the index page is a table with each of the models content columns and links to
|
8
|
-
show, edit and delete the object. There are many ways to customize what gets
|
9
|
-
displayed.
|
10
|
-
|
11
|
-
## Defining Columns
|
12
|
-
|
13
|
-
To display an attribute or a method on a resource, simply pass a symbol into the
|
14
|
-
column method:
|
15
|
-
|
16
|
-
```ruby
|
17
|
-
index do
|
18
|
-
selectable_column
|
19
|
-
column :title
|
20
|
-
end
|
21
|
-
```
|
22
|
-
|
23
|
-
For association columns we make an educated guess on what to display by
|
24
|
-
calling the following methods in the following order:
|
25
|
-
|
26
|
-
```ruby
|
27
|
-
:display_name, :full_name, :name, :username, :login, :title, :email, :to_s
|
28
|
-
```
|
29
|
-
|
30
|
-
This can be customized in `config/initializers/active_admin.rb`.
|
31
|
-
|
32
|
-
If the default title does not work for you, pass it as the first argument:
|
33
|
-
|
34
|
-
```ruby
|
35
|
-
index do
|
36
|
-
selectable_column
|
37
|
-
column "My Custom Title", :title
|
38
|
-
end
|
39
|
-
```
|
40
|
-
|
41
|
-
Sometimes that just isn't enough and you need to write some view-specific code.
|
42
|
-
For example, say we wanted a "Title" column that links to the posts admin screen.
|
43
|
-
|
44
|
-
`column` accepts a block that will be rendered for each of the objects in the collection.
|
45
|
-
The block is called once for each resource, which is passed as an argument to the block.
|
46
|
-
|
47
|
-
```ruby
|
48
|
-
index do
|
49
|
-
selectable_column
|
50
|
-
column "Title" do |post|
|
51
|
-
link_to post.title, admin_post_path(post)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
```
|
55
|
-
|
56
|
-
## Defining Actions
|
57
|
-
|
58
|
-
To setup links to View, Edit and Delete a resource, use the `actions` method:
|
59
|
-
|
60
|
-
```ruby
|
61
|
-
index do
|
62
|
-
selectable_column
|
63
|
-
column :title
|
64
|
-
actions
|
65
|
-
end
|
66
|
-
```
|
67
|
-
|
68
|
-
You can also append custom links to the default links:
|
69
|
-
|
70
|
-
```ruby
|
71
|
-
index do
|
72
|
-
selectable_column
|
73
|
-
column :title
|
74
|
-
actions do |post|
|
75
|
-
item "Preview", admin_preview_post_path(post), class: "member_link"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
```
|
79
|
-
|
80
|
-
Or forego the default links entirely:
|
81
|
-
|
82
|
-
```ruby
|
83
|
-
index do
|
84
|
-
column :title
|
85
|
-
actions defaults: false do |post|
|
86
|
-
item "View", admin_post_path(post)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
```
|
90
|
-
|
91
|
-
Or append custom action with custom html via arbre:
|
92
|
-
|
93
|
-
```ruby
|
94
|
-
index do
|
95
|
-
column :title
|
96
|
-
actions do |post|
|
97
|
-
a "View", href: admin_post_path(post)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
```
|
101
|
-
|
102
|
-
In case you prefer to list actions links in a dropdown menu:
|
103
|
-
|
104
|
-
```ruby
|
105
|
-
index do
|
106
|
-
selectable_column
|
107
|
-
column :title
|
108
|
-
actions dropdown: true do |post|
|
109
|
-
item "Preview", admin_preview_post_path(post)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
```
|
113
|
-
|
114
|
-
In addition, you can insert the position of the row in the greater
|
115
|
-
collection by using the index_column special command:
|
116
|
-
|
117
|
-
```ruby
|
118
|
-
index do
|
119
|
-
selectable_column
|
120
|
-
index_column
|
121
|
-
column :title
|
122
|
-
end
|
123
|
-
```
|
124
|
-
|
125
|
-
index_column take an optional offset parameter to allow a developer to set
|
126
|
-
the starting number for the index (default is 1).
|
127
|
-
|
128
|
-
## Sorting
|
129
|
-
|
130
|
-
When a column is generated from an Active Record attribute, the table is
|
131
|
-
sortable by default. If you are creating a custom column, you may need to give
|
132
|
-
Active Admin a hint for how to sort the table.
|
133
|
-
|
134
|
-
You can pass the key specifying the attribute which gets used to sort objects using Active Record.
|
135
|
-
By default, this is the column on the resource's table that the attribute corresponds to.
|
136
|
-
Otherwise, any attribute that the resource collection responds to can be used.
|
137
|
-
|
138
|
-
```ruby
|
139
|
-
index do
|
140
|
-
column :title, sortable: :title do |post|
|
141
|
-
link_to post.title, admin_post_path(post)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
```
|
145
|
-
|
146
|
-
You can turn off sorting on any column by passing false:
|
147
|
-
|
148
|
-
```ruby
|
149
|
-
index do
|
150
|
-
column :title, sortable: false
|
151
|
-
end
|
152
|
-
```
|
153
|
-
|
154
|
-
It's also possible to sort by PostgreSQL's hstore column key. You should set `sortable`
|
155
|
-
option to a `column->'key'` value:
|
156
|
-
|
157
|
-
```ruby
|
158
|
-
index do
|
159
|
-
column :keywords, sortable: "meta->'keywords'"
|
160
|
-
end
|
161
|
-
```
|
162
|
-
|
163
|
-
## Custom sorting
|
164
|
-
|
165
|
-
It is also possible to use database specific expressions and options for sorting by column
|
166
|
-
|
167
|
-
```ruby
|
168
|
-
order_by(:title) do |order_clause|
|
169
|
-
if order_clause.order == 'desc'
|
170
|
-
[order_clause.to_sql, 'NULLS LAST'].join(' ')
|
171
|
-
else
|
172
|
-
[order_clause.to_sql, 'NULLS FIRST'].join(' ')
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
index do
|
177
|
-
column :title
|
178
|
-
end
|
179
|
-
```
|
180
|
-
|
181
|
-
## Associated Sorting
|
182
|
-
|
183
|
-
You're normally able to sort columns alphabetically, but by default you
|
184
|
-
can't sort by associated objects. Though with a few simple changes, you can.
|
185
|
-
|
186
|
-
Assuming you're on the Books index page, and Book has_one Publisher:
|
187
|
-
|
188
|
-
```ruby
|
189
|
-
controller do
|
190
|
-
def scoped_collection
|
191
|
-
super.includes :publisher # prevents N+1 queries to your database
|
192
|
-
end
|
193
|
-
end
|
194
|
-
```
|
195
|
-
|
196
|
-
You can also define associated objects to include outside of the
|
197
|
-
`scoped_collection` method:
|
198
|
-
|
199
|
-
```ruby
|
200
|
-
includes :publisher
|
201
|
-
```
|
202
|
-
|
203
|
-
Then it's simple to sort by any Publisher attribute from within the index table:
|
204
|
-
|
205
|
-
```ruby
|
206
|
-
index do
|
207
|
-
column :publisher, sortable: 'publishers.name'
|
208
|
-
end
|
209
|
-
```
|
210
|
-
|
211
|
-
## Showing and Hiding Columns
|
212
|
-
|
213
|
-
The entire index block is rendered within the context of the view, so you can
|
214
|
-
easily do things that show or hide columns based on the current context.
|
215
|
-
|
216
|
-
For example, if you were using CanCan:
|
217
|
-
|
218
|
-
```ruby
|
219
|
-
index do
|
220
|
-
column :title, sortable: false
|
221
|
-
column :secret_data if can? :manage, Post
|
222
|
-
end
|
223
|
-
```
|
224
|
-
|
225
|
-
## Custom row class
|
226
|
-
|
227
|
-
In order to add special class to table rows pass the proc object as a `:row_class` option
|
228
|
-
of the `index` method.
|
229
|
-
|
230
|
-
```ruby
|
231
|
-
index row_class: ->elem { 'active' if elem.active? } do
|
232
|
-
# columns
|
233
|
-
end
|
234
|
-
```
|
data/docs/3-index-pages.md
DELETED
@@ -1,328 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/3-index-pages.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Customizing the Index Page
|
6
|
-
|
7
|
-
Filtering and listing resources is one of the most important tasks for
|
8
|
-
administering a web application. Active Admin provides many different tools for
|
9
|
-
you to build a compelling interface into your data for the admin staff.
|
10
|
-
|
11
|
-
Built in, Active Admin has the following index renderers:
|
12
|
-
|
13
|
-
* *Table*: A table drawn with each row being a resource ([View Table Docs](3-index-pages/index-as-table.md))
|
14
|
-
* *Grid*: A set of rows and columns each cell being a resource ([View Grid Docs](3-index-pages/index-as-grid.md))
|
15
|
-
* *Blocks*: A set of rows (not tabular) each row being a resource ([View Blocks Docs](3-index-pages/index-as-block.md))
|
16
|
-
* *Blog*: A title and body content, similar to a blog index ([View Blog Docs](3-index-pages/index-as-blog.md))
|
17
|
-
|
18
|
-
All index pages also support scopes, filters, pagination, action items, and
|
19
|
-
sidebar sections.
|
20
|
-
|
21
|
-
## Multiple Index Pages
|
22
|
-
|
23
|
-
Sometime you may want more than one index page for a resource to represent
|
24
|
-
different views to the user. If multiple index pages exist, Active Admin will
|
25
|
-
automatically build links at the top of the default index page. Including
|
26
|
-
multiple views is simple and requires creating multiple index components in
|
27
|
-
your resource.
|
28
|
-
|
29
|
-
```ruby
|
30
|
-
index do
|
31
|
-
id_column
|
32
|
-
column :image_title
|
33
|
-
actions
|
34
|
-
end
|
35
|
-
|
36
|
-
index as: :grid do |product|
|
37
|
-
link_to image_tag(product.image_path), admin_product_path(product)
|
38
|
-
end
|
39
|
-
```
|
40
|
-
|
41
|
-
The first index component will be the default index page unless you indicate
|
42
|
-
otherwise by setting `:default` to true.
|
43
|
-
|
44
|
-
```ruby
|
45
|
-
index do
|
46
|
-
column :image_title
|
47
|
-
actions
|
48
|
-
end
|
49
|
-
|
50
|
-
index as: :grid, default: true do |product|
|
51
|
-
link_to image_tag(product.image_path), admin_product_path(product)
|
52
|
-
end
|
53
|
-
```
|
54
|
-
|
55
|
-
## Custom Index
|
56
|
-
|
57
|
-
Active Admin does not limit the index page to be a table, block, blog or grid.
|
58
|
-
If you've created your own [custom index](3-index-pages/custom-index.md) page it
|
59
|
-
can be included by setting `:as` to the class of the index component you created.
|
60
|
-
|
61
|
-
```ruby
|
62
|
-
index as: ActiveAdmin::Views::IndexAsMyIdea do
|
63
|
-
column :image_title
|
64
|
-
actions
|
65
|
-
end
|
66
|
-
```
|
67
|
-
|
68
|
-
## Index Filters
|
69
|
-
|
70
|
-
By default the index screen includes a "Filters" sidebar on the right hand side
|
71
|
-
with a filter for each attribute of the registered model. You can customize the
|
72
|
-
filters that are displayed as well as the type of widgets they use.
|
73
|
-
|
74
|
-
To display a filter for an attribute, use the `filter` method
|
75
|
-
|
76
|
-
```ruby
|
77
|
-
ActiveAdmin.register Post do
|
78
|
-
filter :title
|
79
|
-
end
|
80
|
-
```
|
81
|
-
|
82
|
-
Out of the box, Active Admin supports the following filter types:
|
83
|
-
|
84
|
-
* *:string* - A drop down for selecting "Contains", "Equals", "Starts with",
|
85
|
-
"Ends with" and an input for a value.
|
86
|
-
* *:date_range* - A start and end date field with calendar inputs
|
87
|
-
* *:numeric* - A drop down for selecting "Equal To", "Greater Than" or "Less
|
88
|
-
Than" and an input for a value.
|
89
|
-
* *:select* - A drop down which filters based on a selected item in a collection
|
90
|
-
or all.
|
91
|
-
* *:check_boxes* - A list of check boxes users can turn on and off to filter
|
92
|
-
|
93
|
-
By default, Active Admin will pick the most relevant filter based on the
|
94
|
-
attribute type. You can force the type by passing the `:as` option.
|
95
|
-
|
96
|
-
```ruby
|
97
|
-
filter :author, as: :check_boxes
|
98
|
-
```
|
99
|
-
|
100
|
-
The `:check_boxes` and `:select` types accept options for the collection. By default
|
101
|
-
it attempts to create a collection based on an association. But you can pass in
|
102
|
-
the collection as a proc to be called at render time.
|
103
|
-
|
104
|
-
```ruby
|
105
|
-
filter :author, as: :check_boxes, collection: proc { Author.all }
|
106
|
-
```
|
107
|
-
|
108
|
-
To override options for string or numeric filter pass `filters` option.
|
109
|
-
|
110
|
-
```ruby
|
111
|
-
filter :title, filters: [:starts_with, :ends_with]
|
112
|
-
```
|
113
|
-
|
114
|
-
Also, if you don't need the select with the options 'contains', 'equals',
|
115
|
-
'starts_with' or 'ends_with' just add the option to the filter name with an
|
116
|
-
underscore.
|
117
|
-
|
118
|
-
For example:
|
119
|
-
|
120
|
-
```ruby
|
121
|
-
filter :name_equals
|
122
|
-
# or
|
123
|
-
filter :name_contains
|
124
|
-
```
|
125
|
-
|
126
|
-
You can change the filter label by passing a label option:
|
127
|
-
|
128
|
-
```ruby
|
129
|
-
filter :author, label: 'Something else'
|
130
|
-
```
|
131
|
-
|
132
|
-
By default, Active Admin will try to use ActiveModel I18n to determine the label.
|
133
|
-
|
134
|
-
You can also filter on more than one attribute of a model using the [Ransack
|
135
|
-
search predicate
|
136
|
-
syntax](https://github.com/activerecord-hackery/ransack/wiki/Basic-Searching).
|
137
|
-
If using a custom search method, you will also need to specify the field type
|
138
|
-
using `:as` and the label.
|
139
|
-
|
140
|
-
```ruby
|
141
|
-
filter :first_name_or_last_name_cont, as: :string, label: "Name"
|
142
|
-
```
|
143
|
-
|
144
|
-
Filters can also be disabled for a resource, a namespace or the entire
|
145
|
-
application.
|
146
|
-
|
147
|
-
To disable for a specific resource:
|
148
|
-
|
149
|
-
```ruby
|
150
|
-
ActiveAdmin.register Post do
|
151
|
-
config.filters = false
|
152
|
-
end
|
153
|
-
```
|
154
|
-
|
155
|
-
To disable for a namespace, in the initializer:
|
156
|
-
|
157
|
-
```ruby
|
158
|
-
ActiveAdmin.setup do |config|
|
159
|
-
config.namespace :my_namespace do |my_namespace|
|
160
|
-
my_namespace.filters = false
|
161
|
-
end
|
162
|
-
end
|
163
|
-
```
|
164
|
-
|
165
|
-
Or to disable for the entire application:
|
166
|
-
|
167
|
-
```ruby
|
168
|
-
ActiveAdmin.setup do |config|
|
169
|
-
config.filters = false
|
170
|
-
end
|
171
|
-
```
|
172
|
-
|
173
|
-
You can also add a filter and still preserve the default filters:
|
174
|
-
|
175
|
-
```ruby
|
176
|
-
preserve_default_filters!
|
177
|
-
filter :author
|
178
|
-
```
|
179
|
-
|
180
|
-
Or you can also remove a filter and still preserve the default filters:
|
181
|
-
|
182
|
-
```ruby
|
183
|
-
preserve_default_filters!
|
184
|
-
remove_filter :id
|
185
|
-
```
|
186
|
-
|
187
|
-
## Index Scopes
|
188
|
-
|
189
|
-
You can define custom scopes for your index page. This will add a tab bar above
|
190
|
-
the index table to quickly filter your collection on pre-defined scopes. There
|
191
|
-
are a number of ways to define your scopes:
|
192
|
-
|
193
|
-
```ruby
|
194
|
-
scope :all, default: true
|
195
|
-
|
196
|
-
# assumes the model has a scope called ':active'
|
197
|
-
scope :active
|
198
|
-
|
199
|
-
# renames model scope ':leaves' to ':subcategories'
|
200
|
-
scope "Subcategories", :leaves
|
201
|
-
|
202
|
-
# Dynamic scope name
|
203
|
-
scope ->{ Date.today.strftime '%A' }, :published_today
|
204
|
-
|
205
|
-
# custom scope not defined on the model
|
206
|
-
scope("Inactive") { |scope| scope.where(active: false) }
|
207
|
-
|
208
|
-
# conditionally show a custom controller scope
|
209
|
-
scope "Published", if: -> { current_admin_user.can? :manage, Posts } do |posts|
|
210
|
-
posts.published
|
211
|
-
end
|
212
|
-
```
|
213
|
-
|
214
|
-
Scopes can be labelled with a translation, e.g.
|
215
|
-
`active_admin.scopes.scope_method`.
|
216
|
-
|
217
|
-
### Scopes groups
|
218
|
-
|
219
|
-
You can assign group names to scopes to keep related scopes together and separate them from the rest.
|
220
|
-
|
221
|
-
```ruby
|
222
|
-
# a scope in the default group
|
223
|
-
scope :all
|
224
|
-
|
225
|
-
# two scopes used to filter by status
|
226
|
-
scope :active, group: :status
|
227
|
-
scope :inactive, group: :status
|
228
|
-
|
229
|
-
# two scopes used to filter by date
|
230
|
-
scope :today, group: :date
|
231
|
-
scope :tomorrow, group: :date
|
232
|
-
```
|
233
|
-
|
234
|
-
## Index default sort order
|
235
|
-
|
236
|
-
You can define the default sort order for index pages:
|
237
|
-
|
238
|
-
```ruby
|
239
|
-
ActiveAdmin.register Post do
|
240
|
-
config.sort_order = 'name_asc'
|
241
|
-
end
|
242
|
-
```
|
243
|
-
|
244
|
-
## Index pagination
|
245
|
-
|
246
|
-
You can set the number of records per page as default:
|
247
|
-
|
248
|
-
```ruby
|
249
|
-
ActiveAdmin.setup do |config|
|
250
|
-
config.default_per_page = 30
|
251
|
-
end
|
252
|
-
```
|
253
|
-
|
254
|
-
You can set the number of records per page per resources:
|
255
|
-
|
256
|
-
```ruby
|
257
|
-
ActiveAdmin.register Post do
|
258
|
-
config.per_page = 10
|
259
|
-
end
|
260
|
-
```
|
261
|
-
|
262
|
-
Or allow users to choose themselves using dropdown with values
|
263
|
-
|
264
|
-
```ruby
|
265
|
-
ActiveAdmin.register Post do
|
266
|
-
config.per_page = [10, 50, 100]
|
267
|
-
end
|
268
|
-
```
|
269
|
-
|
270
|
-
You can change it per request / action too:
|
271
|
-
|
272
|
-
```ruby
|
273
|
-
controller do
|
274
|
-
before_action only: :index do
|
275
|
-
@per_page = 100
|
276
|
-
end
|
277
|
-
end
|
278
|
-
```
|
279
|
-
|
280
|
-
You can also disable pagination:
|
281
|
-
|
282
|
-
```ruby
|
283
|
-
ActiveAdmin.register Post do
|
284
|
-
config.paginate = false
|
285
|
-
end
|
286
|
-
```
|
287
|
-
|
288
|
-
If you have a very large database, you might want to disable `SELECT COUNT(*)`
|
289
|
-
queries caused by the pagination info at the bottom of the page:
|
290
|
-
|
291
|
-
```ruby
|
292
|
-
ActiveAdmin.register Post do
|
293
|
-
index pagination_total: false do
|
294
|
-
# ...
|
295
|
-
end
|
296
|
-
end
|
297
|
-
```
|
298
|
-
|
299
|
-
## Customizing Download Links
|
300
|
-
|
301
|
-
You can easily remove or customize the download links you want displayed:
|
302
|
-
|
303
|
-
```ruby
|
304
|
-
# Per resource:
|
305
|
-
ActiveAdmin.register Post do
|
306
|
-
|
307
|
-
index download_links: false
|
308
|
-
index download_links: [:pdf]
|
309
|
-
index download_links: proc{ current_user.can_view_download_links? }
|
310
|
-
|
311
|
-
end
|
312
|
-
|
313
|
-
# For the entire application:
|
314
|
-
ActiveAdmin.setup do |config|
|
315
|
-
|
316
|
-
config.download_links = false
|
317
|
-
config.download_links = [:csv, :xml, :json, :pdf]
|
318
|
-
config.download_links = proc { current_user.can_view_download_links? }
|
319
|
-
|
320
|
-
end
|
321
|
-
```
|
322
|
-
|
323
|
-
Note: you have to actually implement PDF rendering for your action, ActiveAdmin
|
324
|
-
does not provide this feature. This setting just allows you to specify formats
|
325
|
-
that you want to show up under the index collection.
|
326
|
-
|
327
|
-
You'll need to use a PDF rendering library like PDFKit or WickedPDF to get the
|
328
|
-
PDF generation you want.
|
data/docs/4-csv-format.md
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/4-csv-format.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Customizing the CSV format
|
6
|
-
|
7
|
-
Active Admin provides CSV file downloads on the index screen for each Resource.
|
8
|
-
By default it will render a CSV file with all the content columns of your
|
9
|
-
registered model.
|
10
|
-
|
11
|
-
Customizing the CSV format is as simple as customizing the index page.
|
12
|
-
|
13
|
-
```ruby
|
14
|
-
ActiveAdmin.register Post do
|
15
|
-
csv do
|
16
|
-
column :title
|
17
|
-
column(:author) { |post| post.author.full_name }
|
18
|
-
column('bODY', humanize_name: false) # preserve case
|
19
|
-
end
|
20
|
-
end
|
21
|
-
```
|
22
|
-
|
23
|
-
You can also set custom CSV settings for an individual resource:
|
24
|
-
|
25
|
-
```ruby
|
26
|
-
ActiveAdmin.register Post do
|
27
|
-
csv force_quotes: true, col_sep: ';', column_names: false do
|
28
|
-
column :title
|
29
|
-
column(:author) { |post| post.author.full_name }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
```
|
33
|
-
|
34
|
-
Or system-wide:
|
35
|
-
|
36
|
-
```ruby
|
37
|
-
# config/initializers/active_admin.rb
|
38
|
-
|
39
|
-
# Set the CSV builder separator
|
40
|
-
config.csv_options = { col_sep: ';' }
|
41
|
-
|
42
|
-
# Force the use of quotes
|
43
|
-
config.csv_options = { force_quotes: true }
|
44
|
-
```
|
45
|
-
|
46
|
-
You can customize the filename by overriding `csv_filename` in the controller block.
|
47
|
-
|
48
|
-
```ruby
|
49
|
-
ActiveAdmin.register User do
|
50
|
-
controller do
|
51
|
-
def csv_filename
|
52
|
-
'User Details.csv'
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
```
|
57
|
-
|
58
|
-
## Streaming
|
59
|
-
|
60
|
-
By default Active Admin streams the CSV response to your browser as it's generated.
|
61
|
-
This is good because it prevents request timeouts, for example the infamous H12
|
62
|
-
error on Heroku.
|
63
|
-
|
64
|
-
However if an exception occurs while generating the CSV, the request will eventually
|
65
|
-
time out, with the last line containing the exception message. CSV streaming is
|
66
|
-
disabled in development to help debug these exceptions. That lets you use tools like
|
67
|
-
better_errors and web-console to debug the issue. If you want to customize the
|
68
|
-
environments where CSV streaming is disabled, you can change this setting:
|
69
|
-
|
70
|
-
```ruby
|
71
|
-
# config/initializers/active_admin.rb
|
72
|
-
|
73
|
-
config.disable_streaming_in = ['development', 'staging']
|
74
|
-
```
|