activeadmin 2.13.0 → 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.

Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +69 -0
  3. data/CONTRIBUTING.md +3 -4
  4. data/README.md +2 -2
  5. data/app/assets/javascripts/active_admin/base.js +1 -4
  6. data/app/assets/stylesheets/active_admin/_forms.scss +1 -1
  7. data/app/assets/stylesheets/active_admin/structure/_footer.scss +6 -1
  8. data/app/views/layouts/active_admin_logged_out.html.erb +5 -4
  9. data/config/locales/fr.yml +3 -3
  10. data/config/locales/vi.yml +34 -7
  11. data/config/locales/zh-CN.yml +36 -17
  12. data/lib/active_admin/application.rb +4 -4
  13. data/lib/active_admin/asset_registration.rb +3 -3
  14. data/lib/active_admin/authorization_adapter.rb +2 -0
  15. data/lib/active_admin/base_controller/authorization.rb +2 -2
  16. data/lib/active_admin/dependency.rb +0 -4
  17. data/lib/active_admin/engine.rb +1 -1
  18. data/lib/active_admin/filters/resource_extension.rb +4 -4
  19. data/lib/active_admin/namespace.rb +2 -2
  20. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +1 -1
  21. data/lib/active_admin/orm/active_record/comments.rb +8 -8
  22. data/lib/active_admin/pundit_adapter.rb +0 -2
  23. data/lib/active_admin/resource/action_items.rb +2 -2
  24. data/lib/active_admin/version.rb +1 -1
  25. data/lib/active_admin/view_helpers/auto_link_helper.rb +1 -1
  26. data/lib/active_admin/views/index_as_table.rb +1 -1
  27. data/lib/active_admin/views/pages/base.rb +4 -3
  28. data/lib/active_admin/views/pages/index.rb +1 -1
  29. data/lib/active_admin.rb +1 -1
  30. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +17 -0
  31. metadata +5 -44
  32. data/docs/.gitignore +0 -1
  33. data/docs/0-installation.md +0 -142
  34. data/docs/1-general-configuration.md +0 -224
  35. data/docs/10-custom-pages.md +0 -150
  36. data/docs/11-decorators.md +0 -70
  37. data/docs/12-arbre-components.md +0 -214
  38. data/docs/13-authorization-adapter.md +0 -285
  39. data/docs/14-gotchas.md +0 -138
  40. data/docs/2-resource-customization.md +0 -475
  41. data/docs/3-index-pages/custom-index.md +0 -35
  42. data/docs/3-index-pages/index-as-block.md +0 -19
  43. data/docs/3-index-pages/index-as-blog.md +0 -69
  44. data/docs/3-index-pages/index-as-grid.md +0 -27
  45. data/docs/3-index-pages/index-as-table.md +0 -234
  46. data/docs/3-index-pages.md +0 -328
  47. data/docs/4-csv-format.md +0 -74
  48. data/docs/5-forms.md +0 -238
  49. data/docs/6-show-pages.md +0 -93
  50. data/docs/7-sidebars.md +0 -75
  51. data/docs/8-custom-actions.md +0 -177
  52. data/docs/9-batch-actions.md +0 -237
  53. data/docs/CNAME +0 -1
  54. data/docs/Gemfile +0 -4
  55. data/docs/Gemfile.lock +0 -283
  56. data/docs/README.md +0 -24
  57. data/docs/_config.yml +0 -4
  58. data/docs/_includes/footer.html +0 -8
  59. data/docs/_includes/google-analytics.html +0 -16
  60. data/docs/_includes/head.html +0 -7
  61. data/docs/_includes/toc.html +0 -98
  62. data/docs/_includes/top-menu.html +0 -17
  63. data/docs/_layouts/default.html +0 -21
  64. data/docs/documentation.md +0 -60
  65. data/docs/images/activeadmin.png +0 -0
  66. data/docs/images/code-header.png +0 -0
  67. data/docs/images/divider.png +0 -0
  68. data/docs/images/features.png +0 -0
  69. data/docs/images/tidelift.svg +0 -14
  70. data/docs/index.html +0 -226
  71. data/docs/stylesheets/main.css +0 -1205
@@ -1,150 +0,0 @@
1
- ---
2
- redirect_from: /docs/10-custom-pages.html
3
- ---
4
-
5
- # Custom Pages
6
-
7
- If you have data you want on a standalone page that isn't tied to a resource,
8
- custom pages provide you with a familiar syntax and feature set:
9
-
10
- * a menu item
11
- * sidebars
12
- * action items
13
- * page actions
14
-
15
- ## Create a new Page
16
-
17
- Creating a page is as simple as calling `register_page`:
18
-
19
- ```ruby
20
- # app/admin/calendar.rb
21
- ActiveAdmin.register_page "Calendar" do
22
- content do
23
- para "Hello World"
24
- end
25
- end
26
- ```
27
-
28
- Anything rendered within `content` will be the main content on the page.
29
- Partials behave exactly the same way as they do for resources:
30
-
31
- ```ruby
32
- # app/admin/calendar.rb
33
- ActiveAdmin.register_page "Calendar" do
34
- content do
35
- render partial: 'calendar'
36
- end
37
- end
38
-
39
- # app/views/admin/calendar/_calendar.html.arb
40
- table do
41
- thead do
42
- tr do
43
- %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday].each &method(:th)
44
- end
45
- end
46
- tbody do
47
- # ...
48
- end
49
- end
50
- ```
51
-
52
- ## Customize the Menu
53
-
54
- See the [Menu](2-resource-customization.md#customize-the-menu) documentation.
55
-
56
- ## Customize the breadcrumbs
57
-
58
- ```ruby
59
- ActiveAdmin.register_page "Calendar" do
60
- breadcrumb do
61
- ['admin', 'calendar']
62
- end
63
- end
64
- ```
65
-
66
- ## Customize the Namespace
67
-
68
- We use the `admin` namespace by default, but you can use anything:
69
-
70
- ```ruby
71
- # Available at /today/calendar
72
- ActiveAdmin.register_page "Calendar", namespace: :today
73
-
74
- # Available at /calendar
75
- ActiveAdmin.register_page "Calendar", namespace: false
76
- ```
77
-
78
- ## Belongs To
79
-
80
- To nest the page within another resource, you can use the `belongs_to` method:
81
-
82
- ```ruby
83
- ActiveAdmin.register Project
84
- ActiveAdmin.register_page "Status" do
85
- belongs_to :project
86
- end
87
- ```
88
-
89
- See also the [Belongs To](2-resource-customization.md#belongs-to) documentation
90
- and examples.
91
-
92
- ## Add a Sidebar
93
-
94
- See the [Sidebars](7-sidebars.md) documentation.
95
-
96
- ## Add an Action Item
97
-
98
- Just like other resources, you can add action items. The difference here being that
99
- `:only` and `:except` don't apply because there's only one page it could apply to.
100
-
101
- ```ruby
102
- action_item :view_site do
103
- link_to "View Site", "/"
104
- end
105
- ```
106
-
107
- ## Add a Page Action
108
-
109
- Page actions are custom controller actions (which mirror the resource DSL for
110
- the same feature).
111
-
112
- ```ruby
113
- page_action :add_event, method: :post do
114
- # ...
115
- redirect_to admin_calendar_path, notice: "Your event was added"
116
- end
117
-
118
- action_item :add do
119
- link_to "Add Event", admin_calendar_add_event_path, method: :post
120
- end
121
- ```
122
-
123
- This defines the route `/admin/calendar/add_event` which can handle HTTP POST requests.
124
-
125
- Clicking on the action item will reload page and display the message "Your event
126
- was added"
127
-
128
- Page actions can handle multiple HTTP verbs.
129
-
130
- ```ruby
131
- page_action :add_event, method: [:get, :post] do
132
- # ...
133
- end
134
- ```
135
-
136
- See also the [Custom Actions](8-custom-actions.md#http-verbs) example.
137
-
138
- ## Use custom column as id
139
-
140
- You can use custom parameter instead of id
141
-
142
- ```ruby
143
- ActiveAdmin.register User do
144
- controller do
145
- defaults :finder => :find_by_name
146
- end
147
- end
148
- ```
149
-
150
- This defines the resource route as `/admin/users/john` if user name is john
@@ -1,70 +0,0 @@
1
- ---
2
- redirect_from: /docs/11-decorators.html
3
- ---
4
-
5
- # Decorators
6
-
7
- Active Admin allows you to use the decorator pattern to provide view-specific
8
- versions of a resource. [Draper](https://github.com/drapergem/draper) is
9
- recommended but not required.
10
-
11
- ## Example usage
12
-
13
- ```ruby
14
- # app/models/post.rb
15
- class Post < ActiveRecord::Base
16
- # has title, content, and image_url
17
- end
18
-
19
- # app/decorators/post_decorator.rb
20
- class PostDecorator < Draper::Decorator
21
- delegate_all
22
-
23
- def image
24
- h.image_tag model.image_url
25
- end
26
- end
27
-
28
- # app/admin/post.rb
29
- ActiveAdmin.register Post do
30
- decorate_with PostDecorator
31
-
32
- index do
33
- column :title
34
- column :image
35
- actions
36
- end
37
- end
38
- ```
39
-
40
- You can pass any decorator class as an argument to `decorate_with`
41
- as long as it accepts the record to be decorated as a parameter in
42
- the initializer, and responds to all the necessary methods.
43
-
44
- ```ruby
45
- # app/decorators/post_decorator.rb
46
- class PostDecorator
47
- attr_reader :post
48
- delegate_missing_to :post
49
-
50
- def initialize(post)
51
- @post = post
52
- end
53
- end
54
- ```
55
-
56
- ## Forms
57
-
58
- By default, ActiveAdmin does *not* decorate the resource used to render forms.
59
- If you need ActiveAdmin to decorate the forms, you can pass `decorate: true` to the
60
- form block.
61
-
62
- ```ruby
63
- ActiveAdmin.register Post do
64
- decorate_with PostDecorator
65
-
66
- form decorate: true do |f|
67
- # ...
68
- end
69
- end
70
- ```
@@ -1,214 +0,0 @@
1
- ---
2
- redirect_from: /docs/12-arbre-components.html
3
- ---
4
-
5
- # Arbre Components
6
-
7
- Arbre allows the creation of shareable and extendable HTML components and is
8
- used throughout Active Admin to create view components.
9
-
10
- ## Text Node
11
-
12
- Sometimes it makes sense to insert something into a registered resource like a
13
- non-breaking space or some text. The text_node method can be used to insert
14
- these elements into the page inside of other Arbre components or resource
15
- controller functions.
16
-
17
- ```ruby
18
- ActiveAdmin.register Post do
19
- show do
20
- panel "Post Details" do
21
- attributes_table_for post do
22
- row :id
23
- row 'Tags' do
24
- post.tags.each do |tag|
25
- a tag, href: admin_post_path(q: {tagged_with_contains: tag})
26
- text_node "&nbsp;".html_safe
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
33
- ```
34
-
35
- ## Panels
36
-
37
- A panel is a component that takes up all available horizontal space and takes a
38
- title and a hash of attributes as arguments. If a sidebar is present, a panel
39
- will take up the remaining space.
40
-
41
- This will create two stacked panels:
42
-
43
- ```ruby
44
- show do
45
- panel "Post Details" do
46
- render partial: "details", locals: {post: post}
47
- end
48
-
49
- panel "Post Tags" do
50
- render partial: "tags", locals: {post: post}
51
- end
52
- end
53
- ```
54
-
55
- ## Columns
56
-
57
- The Columns component allows you draw content into scalable columns. All you
58
- need to do is define the number of columns and the component will take care of
59
- the rest.
60
-
61
- ### Simple Columns
62
-
63
- To create simple columns, use the `columns` method. Within the block, call
64
- the #column method to create a new column.
65
-
66
- ```ruby
67
- columns do
68
- column do
69
- span "Column #1"
70
- end
71
-
72
- column do
73
- span "Column #2"
74
- end
75
- end
76
- ```
77
-
78
- ### Spanning Multiple Columns
79
-
80
- To create columns that have multiple spans, pass the :span option to the column
81
- method.
82
-
83
- ```ruby
84
- columns do
85
- column span: 2 do
86
- span "Column # 1"
87
- end
88
- column do
89
- span "Column # 2"
90
- end
91
- end
92
- ```
93
-
94
- By default, each column spans 1 column. The above layout would have 2 columns,
95
- the first being twice as large as the second.
96
-
97
- ### Custom Column Widths
98
-
99
- Active Admin uses a fluid width layout, causing column width to be defined
100
- using percentages. Due to using this style of layout, columns can shrink or
101
- expand past points that may not be desirable. To overcome this issue,
102
- columns provide `:max_width` and `:min_width` options.
103
-
104
- ```ruby
105
- columns do
106
- column max_width: "200px", min_width: "100px" do
107
- span "Column # 1"
108
- end
109
- column do
110
- span "Column # 2"
111
- end
112
- end
113
- ```
114
-
115
- In the above example, the first column will not grow larger than 200px and will
116
- not shrink less than 100px.
117
-
118
- ### Custom Column Class
119
-
120
- Pass the `:class` option to the column method to set a custom class.
121
-
122
- ```ruby
123
- columns do
124
- column class: "important" do
125
- span "Column # 1"
126
- end
127
- column do
128
- span "Column # 2"
129
- end
130
- end
131
- ```
132
-
133
- ## Table For
134
-
135
- Table For provides the ability to create tables like those present
136
- in `index_as_table`. It takes a collection and a hash of options and then
137
- uses `column` to build the fields to show with the table.
138
-
139
- ```ruby
140
- table_for order.payments do
141
- column(:payment_type) { |payment| payment.payment_type.titleize }
142
- column "Received On", :created_at
143
- column "Details & Notes", :payment_details
144
- column "Amount", :amount_in_dollars
145
- end
146
- ```
147
-
148
- The `column` method can take a title as its first argument and data
149
- (`:your_method`) as its second (or first if no title provided). Column also
150
- takes a block.
151
-
152
- ### Internationalization
153
-
154
- To customize the internationalization for the component, specify a resource to
155
- use for translations via the `i18n` named parameter. This is only necessary for
156
- non-`ActiveRecord::Relation` collections:
157
-
158
- ```ruby
159
- table_for payments, i18n: Payment do
160
- # ...
161
- end
162
- ```
163
-
164
- ## Status tag
165
-
166
- Status tags provide convenient syntactic sugar for styling items that have
167
- status. A common example of where the status tag could be useful is for orders
168
- that are complete or in progress. `status_tag` takes a status, like
169
- "In Progress", and a hash of options. The status_tag will generate HTML markup
170
- that Active Admin CSS uses in styling.
171
-
172
- ```ruby
173
- status_tag 'In Progress'
174
- # => <span class='status_tag in_progress'>In Progress</span>
175
-
176
- status_tag 'active', class: 'important', id: 'status_123', label: 'on'
177
- # => <span class='status_tag active important' id='status_123'>on</span>
178
- ```
179
-
180
- When providing a `true` or `false` value, the `status_tag` will display "Yes"
181
- or "No". This can be configured through the `"en.active_admin.status_tag"`
182
- locale.
183
-
184
- ```ruby
185
- status_tag true
186
- # => <span class='status_tag yes'>Yes</span>
187
- ```
188
-
189
- In the case that a boolean field is `nil`, it will display "No" as a default.
190
- But using the `"en.active_admin.status_tag.unset"` locale key, it can be
191
- configured to display something else.
192
-
193
- ## Tabs
194
-
195
- The Tabs component is helpful for saving page real estate. The first tab will be
196
- the one open when the page initially loads and the rest hidden. You can click
197
- each tab to toggle back and forth between them. Arbre supports unlimited number
198
- of tabs.
199
-
200
- ```ruby
201
- tabs do
202
- tab :active do
203
- table_for orders.active do
204
- ...
205
- end
206
- end
207
-
208
- tab :inactive do
209
- table_for orders.inactive do
210
- ...
211
- end
212
- end
213
- end
214
- ```
@@ -1,285 +0,0 @@
1
- ---
2
- redirect_from: /docs/13-authorization-adapter.html
3
- ---
4
-
5
- # Authorization Adapter
6
-
7
- Active Admin offers the ability to define and use your own authorization
8
- adapter. If implemented, the '#authorized?' will be called when an action is
9
- taken. By default, '#authorized?' returns true.
10
-
11
- ## Setting up your own AuthorizationAdapter
12
-
13
- The following example shows how to set up and tie your authorization
14
- adapter class to Active Admin:
15
-
16
- ```ruby
17
- # app/models/only_authors_authorization.rb
18
- class OnlyAuthorsAuthorization < ActiveAdmin::AuthorizationAdapter
19
-
20
- def authorized?(action, subject = nil)
21
- case subject
22
- when normalized(Post)
23
- # Only let the author update and delete posts
24
- if action == :update || action == :destroy
25
- subject.author == user
26
- else
27
- true
28
- end
29
- else
30
- true
31
- end
32
- end
33
-
34
- end
35
- ```
36
-
37
- In order to hook up `OnlyAuthorsAuthorization` to Active Admin, go to your
38
- application's `config/initializers/active_admin.rb` and add/modify the line:
39
-
40
- ```ruby
41
- config.authorization_adapter = "OnlyAuthorsAuthorization"
42
- ```
43
-
44
- Now, whenever a controller action is performed, the `OnlyAuthorsAuthorization`'s
45
- `#authorized?` method will be called.
46
-
47
- Authorization adapters can be configured per ActiveAdmin namespace as well, for
48
- example:
49
-
50
- ```ruby
51
- ActiveAdmin.setup do |config|
52
- config.namespace :admin do |ns|
53
- ns.authorization_adapter = "AdminAuthorization"
54
- end
55
- config.namespace :my do |ns|
56
- ns.authorization_adapter = "DashboardAuthorization"
57
- end
58
- end
59
- ```
60
-
61
- ## Getting Access to the Current User
62
-
63
- From within your authorization adapter, you can call the `#user` method to
64
- retrieve the current user.
65
-
66
- ```ruby
67
- class OnlyAdmins < ActiveAdmin::AuthorizationAdapter
68
-
69
- def authorized?(action, subject = nil)
70
- user.admin?
71
- end
72
-
73
- end
74
- ```
75
-
76
- ## Scoping Collections in Authorization Adapters
77
-
78
- `ActiveAdmin::AuthorizationAdapter` also provides a hook method
79
- (`#scope_collection`) for the adapter to scope the resource's collection. For
80
- example, you may want to centralize the scoping:
81
-
82
- ```ruby
83
- class OnlyMyAccount < ActiveAdmin::AuthorizationAdapter
84
-
85
- def authorized?(action, subject = nil)
86
- subject.account == user.account
87
- end
88
-
89
- def scope_collection(collection, action = Auth::READ)
90
- collection.where(account_id: user.account_id)
91
- end
92
-
93
- end
94
- ```
95
-
96
- All collections presented on Index Screens will be passed through this method
97
- and will be scoped accordingly.
98
-
99
- ## Managing Access to Pages
100
-
101
- Pages, just like resources, get authorized too. When authorizing a page, the
102
- subject will be an instance of `ActiveAdmin::Page`.
103
-
104
- ```ruby
105
- class OnlyDashboard < ActiveAdmin::AuthorizationAdapter
106
- def authorized?(action, subject = nil)
107
- case subject
108
- when ActiveAdmin::Page
109
- action == :read &&
110
- subject.name == "Dashboard" &&
111
- subject.namespace.name == :admin
112
- else
113
- false
114
- end
115
- end
116
- end
117
- ```
118
-
119
- ## Action Types
120
-
121
- By default Active Admin simplifies the controller actions into 4 actions:
122
-
123
- * `:read` - This controls if the user can view the menu item as well as the
124
- index and show screens.
125
- * `:create` - This controls if the user can view the new screen and submit
126
- the form to the create action.
127
- * `:update` - This controls if the user can view the edit screen and submit
128
- the form to the update action.
129
- * `:destroy` - This controls if the user can delete a resource.
130
-
131
- Each of these actions is available as a constant. Eg: `:read` is available as
132
- `ActiveAdmin::Authorization::READ`.
133
-
134
- ## Checking for Authorization in Controllers and Views
135
-
136
- Active Admin provides a helper method to check if the current user is
137
- authorized to perform an action on a subject.
138
-
139
- Use the `#authorized?(action, subject)` method to check.
140
-
141
- ```ruby
142
- ActiveAdmin.register Post do
143
-
144
- index do
145
- column :title
146
- column '' do |post|
147
- link_to 'Edit', admin_post_path(post) if authorized? :update, post
148
- end
149
- end
150
-
151
- end
152
- ```
153
-
154
- If you are implementing a custom controller action, you can use the
155
- `#authorize!` method to raise an `ActiveAdmin::AccessDenied` exception.
156
-
157
- ```ruby
158
- ActiveAdmin.register Post do
159
-
160
- member_action :publish, method: :post do
161
- post = Post.find(params[:id])
162
-
163
- authorize! :publish, post
164
- post.publish!
165
-
166
- flash[:notice] = "Post has been published"
167
- redirect_to [:admin, post]
168
- end
169
-
170
- action_item :publish, only: :show do
171
- if !post.published? && authorized?(:publish, post)
172
- link_to "Publish", publish_admin_post_path(post), method: :post
173
- end
174
- end
175
-
176
- end
177
- ```
178
-
179
- ## Using the CanCan Adapter
180
-
181
- Sub-classing `ActiveAdmin::AuthorizationAdapter` is fairly low level. Many times
182
- it's nicer to have a simpler DSL for managing authorization. Active Admin
183
- provides an adapter out of the box for [CanCanCan](https://github.com/CanCanCommunity/cancancan).
184
-
185
- To use the CanCan adapter, update the configuration in the Active Admin
186
- initializer:
187
-
188
- ```ruby
189
- config.authorization_adapter = ActiveAdmin::CanCanAdapter
190
- ```
191
-
192
- You can also specify a method to be called on unauthorized access. This is
193
- necessary in order to prevent a redirect loop that can happen if a user tries to
194
- access a page they don't have permissions for (see
195
- [#2081](https://github.com/activeadmin/activeadmin/issues/2081)).
196
-
197
- ```ruby
198
- config.on_unauthorized_access = :access_denied
199
- ```
200
-
201
- The method `access_denied` would be defined in `application_controller.rb`. Here
202
- is one example that redirects the user from the page they don't have permission
203
- to access to a resource they have permission to access (organizations in this
204
- case), and also displays the error message in the browser:
205
-
206
- ```ruby
207
- class ApplicationController < ActionController::Base
208
- protect_from_forgery
209
-
210
- def access_denied(exception)
211
- redirect_to admin_organizations_path, alert: exception.message
212
- end
213
- end
214
- ```
215
-
216
- By default this will use the ability class named "Ability". This can also be
217
- changed from the initializer:
218
-
219
- ```ruby
220
- config.cancan_ability_class = "MyCustomAbility"
221
- ```
222
-
223
- Now you can simply use CanCanCan the way that you would expect and
224
- Active Admin will use it for authorization:
225
-
226
- ```ruby
227
- # app/models/ability.rb
228
- class Ability
229
- include CanCan::Ability
230
-
231
- def initialize(user)
232
- can :manage, Post
233
- can :read, User
234
- can :manage, User, id: user.id
235
- can :read, ActiveAdmin::Page, name: "Dashboard", namespace_name: "admin"
236
- end
237
-
238
- end
239
- ```
240
-
241
- To view more details about the API's, visit project pages of
242
- [CanCanCan](https://github.com/CanCanCommunity/cancancan).
243
-
244
- ## Using the Pundit Adapter
245
-
246
- Active Admin also provides an adapter out of the box for
247
- [Pundit](https://github.com/varvet/pundit).
248
-
249
- To use the Pundit adapter, update the configuration in the Active Admin
250
- initializer:
251
-
252
- ```ruby
253
- config.authorization_adapter = ActiveAdmin::PunditAdapter
254
- ```
255
-
256
- Once that's done, Active Admin will pick up your Pundit policies, and use
257
- them for authorization. For more information about setting up Pundit, see
258
- [their documentation](https://github.com/varvet/pundit#installation).
259
-
260
- Pundit also has [verify_authorized and/or verify_policy_scoped
261
- methods](https://github.com/varvet/pundit#ensuring-policies-and-scopes-are-used)
262
- to enforce usage of `authorized` and `policy_scope`. This conflicts with Active
263
- Admin's authorization architecture, so if you're using those features, you'll
264
- want to disable them for Active Admin's controllers:
265
-
266
- ```ruby
267
- class ApplicationController < ActionController::Base
268
- include Pundit
269
- after_action :verify_authorized, except: :index, unless: :active_admin_controller?
270
- after_action :verify_policy_scoped, only: :index, unless: :active_admin_controller?
271
-
272
- def active_admin_controller?
273
- is_a?(ActiveAdmin::BaseController)
274
- end
275
- end
276
- ```
277
-
278
- If you want to use batch actions, ensure that `destroy_all?` method is defined
279
- in your policy class. You can use this [template
280
- policy](https://github.com/activeadmin/activeadmin/blob/master/spec/support/templates/policies/application_policy.rb)
281
- in your application instead of default one generated by Pundit's
282
- `rails g pundit:install` command.
283
-
284
- In addition, there are [example policies](https://github.com/activeadmin/activeadmin/tree/master/spec/support/templates/policies/active_admin)
285
- for restricting access to ActiveAdmin's pages and comments.