activeadmin 2.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +469 -32
- data/CONTRIBUTING.md +46 -69
- data/README.md +13 -6
- data/app/assets/javascripts/active_admin/base.js +521 -0
- data/app/assets/stylesheets/active_admin/_base.scss +53 -37
- data/app/assets/stylesheets/active_admin/_forms.scss +1 -11
- data/app/assets/stylesheets/active_admin/_header.scss +40 -8
- data/app/assets/stylesheets/active_admin/_mixins.scss +1 -1
- data/{vendor → app}/assets/stylesheets/active_admin/_normalize.scss +25 -123
- data/app/assets/stylesheets/active_admin/{print.scss → _print.scss} +2 -2
- data/app/assets/stylesheets/active_admin/components/_comments.scss +2 -2
- data/app/assets/stylesheets/active_admin/components/_date_picker.scss +1 -2
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +0 -1
- data/app/assets/stylesheets/active_admin/components/_tables.scss +1 -2
- data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -8
- data/app/assets/stylesheets/active_admin/mixins/_variables.scss +17 -0
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +6 -1
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +1 -1
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +0 -1
- data/app/javascript/active_admin/base.js +28 -0
- data/app/{assets/javascripts/active_admin/lib/batch_actions.es6 → javascript/active_admin/initializers/batch-actions.js} +9 -3
- data/app/javascript/active_admin/initializers/checkbox-toggler.js +3 -0
- data/app/javascript/active_admin/initializers/dropdown-menu.js +9 -0
- data/app/javascript/active_admin/initializers/filters.js +10 -0
- data/app/{assets/javascripts/active_admin/lib/has_many.es6 → javascript/active_admin/initializers/has-many.js} +4 -1
- data/app/javascript/active_admin/initializers/per-page.js +13 -0
- data/app/javascript/active_admin/initializers/table-checkbox-toggler.js +3 -0
- data/app/{assets/javascripts/active_admin/lib/checkbox-toggler.es6 → javascript/active_admin/lib/checkbox-toggler.js} +5 -5
- data/app/{assets/javascripts/active_admin/lib/dropdown-menu.es6 → javascript/active_admin/lib/dropdown-menu.js} +3 -10
- data/app/javascript/active_admin/lib/filters.js +39 -0
- data/app/{assets/javascripts/active_admin/lib/modal_dialog.es6 → javascript/active_admin/lib/modal-dialog.js} +10 -8
- data/app/javascript/active_admin/lib/per-page.js +38 -0
- data/app/{assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 → javascript/active_admin/lib/table-checkbox-toggler.js} +5 -3
- data/app/javascript/active_admin/lib/utils.js +40 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +2 -2
- data/app/views/active_admin/devise/shared/_links.erb +1 -1
- data/app/views/active_admin/page/index.html.arb +1 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.html.arb +1 -0
- data/app/views/active_admin/resource/new.html.arb +1 -0
- data/app/views/active_admin/resource/show.html.arb +1 -0
- data/app/views/kaminari/active_admin_countless/_first_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_gap.html.erb +8 -0
- data/app/views/kaminari/active_admin_countless/_next_page.html.erb +11 -0
- data/app/views/kaminari/active_admin_countless/_page.html.erb +12 -0
- data/app/views/kaminari/active_admin_countless/_paginator.html.erb +24 -0
- data/app/views/kaminari/active_admin_countless/_prev_page.html.erb +11 -0
- data/app/views/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +18 -7
- data/config/locales/ar.yml +6 -6
- data/config/locales/az.yml +138 -0
- data/config/locales/ca.yml +0 -1
- data/config/locales/de.yml +18 -0
- data/config/locales/en-CA.yml +3 -3
- data/config/locales/en-GB.yml +3 -3
- data/config/locales/en.yml +3 -3
- data/config/locales/es-MX.yml +2 -1
- data/config/locales/es.yml +5 -5
- data/config/locales/fr.yml +7 -7
- data/config/locales/it.yml +18 -0
- data/config/locales/ja.yml +3 -3
- data/config/locales/ko.yml +1 -1
- data/config/locales/lv.yml +2 -2
- data/config/locales/nl.yml +1 -1
- data/config/locales/ro.yml +3 -2
- data/config/locales/sk.yml +59 -0
- data/config/locales/vi.yml +40 -12
- data/config/locales/zh-CN.yml +36 -17
- data/lib/active_admin/abstract_view_factory.rb +1 -0
- data/lib/active_admin/application.rb +20 -20
- data/lib/active_admin/application_settings.rb +4 -3
- data/lib/active_admin/asset_registration.rb +4 -3
- data/lib/active_admin/authorization_adapter.rb +6 -3
- data/lib/active_admin/base_controller/authorization.rb +15 -13
- data/lib/active_admin/base_controller/menu.rb +1 -0
- data/lib/active_admin/base_controller.rb +6 -5
- data/lib/active_admin/batch_actions/controller.rb +4 -3
- data/lib/active_admin/batch_actions/resource_extension.rb +10 -8
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +4 -3
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +7 -6
- data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -3
- data/lib/active_admin/batch_actions.rb +1 -0
- data/lib/active_admin/callbacks.rb +1 -0
- data/lib/active_admin/cancan_adapter.rb +2 -1
- data/lib/active_admin/collection_decorator.rb +32 -0
- data/lib/active_admin/component.rb +1 -0
- data/lib/active_admin/controller_action.rb +1 -0
- data/lib/active_admin/csv_builder.rb +13 -23
- data/lib/active_admin/dependency.rb +12 -15
- data/lib/active_admin/deprecation.rb +1 -0
- data/lib/active_admin/devise.rb +16 -5
- data/lib/active_admin/dsl.rb +2 -1
- data/lib/active_admin/dynamic_setting.rb +1 -0
- data/lib/active_admin/dynamic_settings_node.rb +3 -2
- data/lib/active_admin/engine.rb +13 -9
- data/lib/active_admin/error.rb +1 -2
- data/lib/active_admin/filters/active.rb +2 -1
- data/lib/active_admin/filters/active_filter.rb +7 -7
- data/lib/active_admin/filters/active_sidebar.rb +4 -30
- data/lib/active_admin/filters/dsl.rb +1 -0
- data/lib/active_admin/filters/forms.rb +7 -6
- data/lib/active_admin/filters/formtastic_addons.rb +2 -6
- data/lib/active_admin/filters/resource_extension.rb +30 -5
- data/lib/active_admin/filters.rb +8 -7
- data/lib/active_admin/form_builder.rb +25 -20
- data/lib/active_admin/generators/boilerplate.rb +13 -4
- data/lib/active_admin/helpers/collection.rb +2 -0
- data/lib/active_admin/helpers/i18n.rb +1 -0
- data/lib/active_admin/helpers/optional_display.rb +3 -2
- data/lib/active_admin/helpers/routes/url_helpers.rb +1 -0
- data/lib/active_admin/helpers/scope_chain.rb +1 -0
- data/lib/active_admin/inputs/datepicker_input.rb +2 -1
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +5 -4
- data/lib/active_admin/inputs/filters/base.rb +2 -1
- data/lib/active_admin/inputs/filters/boolean_input.rb +2 -1
- data/lib/active_admin/inputs/filters/check_boxes_input.rb +2 -1
- data/lib/active_admin/inputs/filters/date_picker_input.rb +1 -0
- data/lib/active_admin/inputs/filters/date_range_input.rb +16 -12
- data/lib/active_admin/inputs/filters/numeric_input.rb +1 -0
- data/lib/active_admin/inputs/filters/select_input.rb +3 -2
- data/lib/active_admin/inputs/filters/string_input.rb +1 -0
- data/lib/active_admin/inputs/filters/text_input.rb +1 -0
- data/lib/active_admin/inputs.rb +1 -0
- data/lib/active_admin/localizers/resource_localizer.rb +4 -3
- data/lib/active_admin/localizers.rb +2 -1
- data/lib/active_admin/menu.rb +7 -3
- data/lib/active_admin/menu_collection.rb +1 -0
- data/lib/active_admin/menu_item.rb +8 -7
- data/lib/active_admin/namespace.rb +15 -14
- data/lib/active_admin/namespace_settings.rb +21 -4
- data/lib/active_admin/order_clause.rb +3 -2
- data/lib/active_admin/orm/active_record/comments/comment.rb +4 -3
- data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -0
- data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -0
- data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +1 -0
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +21 -20
- data/lib/active_admin/orm/active_record/comments/views.rb +3 -2
- data/lib/active_admin/orm/active_record/comments.rb +28 -27
- data/lib/active_admin/orm/active_record.rb +2 -1
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/page.rb +2 -1
- data/lib/active_admin/page_controller.rb +1 -0
- data/lib/active_admin/page_dsl.rb +1 -0
- data/lib/active_admin/page_presenter.rb +1 -0
- data/lib/active_admin/pundit_adapter.rb +57 -15
- data/lib/active_admin/resource/action_items.rb +6 -5
- data/lib/active_admin/resource/attributes.rb +2 -1
- data/lib/active_admin/resource/belongs_to.rb +6 -2
- data/lib/active_admin/resource/controllers.rb +2 -1
- data/lib/active_admin/resource/includes.rb +1 -0
- data/lib/active_admin/resource/menu.rb +5 -4
- data/lib/active_admin/resource/model.rb +16 -0
- data/lib/active_admin/resource/naming.rb +6 -5
- data/lib/active_admin/resource/ordering.rb +1 -0
- data/lib/active_admin/resource/page_presenters.rb +1 -0
- data/lib/active_admin/resource/pagination.rb +1 -0
- data/lib/active_admin/resource/routes.rb +17 -10
- data/lib/active_admin/resource/scope_to.rb +8 -7
- data/lib/active_admin/resource/scopes.rb +1 -0
- data/lib/active_admin/resource/sidebars.rb +2 -1
- data/lib/active_admin/resource.rb +33 -19
- data/lib/active_admin/resource_collection.rb +1 -0
- data/lib/active_admin/resource_controller/action_builder.rb +1 -0
- data/lib/active_admin/resource_controller/data_access.rb +31 -5
- data/lib/active_admin/resource_controller/decorators.rb +8 -29
- data/lib/active_admin/resource_controller/polymorphic_routes.rb +38 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +1 -0
- data/lib/active_admin/resource_controller/scoping.rb +1 -0
- data/lib/active_admin/resource_controller/sidebars.rb +1 -0
- data/lib/active_admin/resource_controller/streaming.rb +9 -7
- data/lib/active_admin/resource_controller.rb +14 -10
- data/lib/active_admin/resource_dsl.rb +11 -25
- data/lib/active_admin/router.rb +1 -0
- data/lib/active_admin/scope.rb +7 -6
- data/lib/active_admin/settings_node.rb +1 -0
- data/lib/active_admin/sidebar_section.rb +1 -0
- data/lib/active_admin/version.rb +2 -1
- data/lib/active_admin/view_factory.rb +18 -17
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +1 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +2 -1
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +4 -3
- data/lib/active_admin/view_helpers/display_helper.rb +15 -7
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +2 -1
- data/lib/active_admin/view_helpers/fields_for.rb +3 -2
- data/lib/active_admin/view_helpers/flash_helper.rb +1 -0
- data/lib/active_admin/view_helpers/form_helper.rb +1 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +1 -0
- data/lib/active_admin/view_helpers/scope_name_helper.rb +1 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +1 -0
- data/lib/active_admin/view_helpers/title_helper.rb +1 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +1 -0
- data/lib/active_admin/view_helpers.rb +2 -1
- data/lib/active_admin/views/action_items.rb +1 -0
- data/lib/active_admin/views/components/active_admin_form.rb +7 -6
- data/lib/active_admin/views/components/active_filters_sidebar_content.rb +59 -0
- data/lib/active_admin/views/components/attributes_table.rb +6 -5
- data/lib/active_admin/views/components/blank_slate.rb +2 -1
- data/lib/active_admin/views/components/columns.rb +1 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +7 -9
- data/lib/active_admin/views/components/index_list.rb +4 -3
- data/lib/active_admin/views/components/menu.rb +2 -1
- data/lib/active_admin/views/components/menu_item.rb +5 -4
- data/lib/active_admin/views/components/paginated_collection.rb +21 -19
- data/lib/active_admin/views/components/panel.rb +2 -1
- data/lib/active_admin/views/components/scopes.rb +8 -5
- data/lib/active_admin/views/components/sidebar.rb +1 -0
- data/lib/active_admin/views/components/sidebar_section.rb +1 -0
- data/lib/active_admin/views/components/site_title.rb +2 -1
- data/lib/active_admin/views/components/status_tag.rb +12 -11
- data/lib/active_admin/views/components/table_for.rb +19 -17
- data/lib/active_admin/views/components/tabs.rb +4 -3
- data/lib/active_admin/views/components/unsupported_browser.rb +1 -0
- data/lib/active_admin/views/footer.rb +3 -1
- data/lib/active_admin/views/header.rb +3 -2
- data/lib/active_admin/views/index_as_block.rb +1 -0
- data/lib/active_admin/views/index_as_blog.rb +2 -1
- data/lib/active_admin/views/index_as_grid.rb +2 -1
- data/lib/active_admin/views/index_as_table.rb +24 -16
- data/lib/active_admin/views/pages/base.rb +22 -14
- data/lib/active_admin/views/pages/form.rb +1 -0
- data/lib/active_admin/views/pages/index.rb +16 -13
- data/lib/active_admin/views/pages/layout.rb +1 -0
- data/lib/active_admin/views/pages/page.rb +1 -0
- data/lib/active_admin/views/pages/show.rb +1 -0
- data/lib/active_admin/views/tabbed_navigation.rb +3 -2
- data/lib/active_admin/views/title_bar.rb +2 -1
- data/lib/active_admin/views.rb +2 -1
- data/lib/active_admin.rb +63 -64
- data/lib/activeadmin.rb +2 -1
- data/lib/generators/active_admin/assets/assets_generator.rb +3 -2
- data/lib/generators/active_admin/assets/templates/active_admin.scss +2 -2
- data/lib/generators/active_admin/devise/devise_generator.rb +6 -5
- data/lib/generators/active_admin/install/install_generator.rb +15 -8
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +38 -1
- data/lib/generators/active_admin/install/templates/dashboard.rb +1 -0
- data/lib/generators/active_admin/page/page_generator.rb +2 -1
- data/lib/generators/active_admin/page/templates/page.rb +1 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +4 -3
- data/lib/generators/active_admin/resource/templates/admin.rb.erb +4 -2
- data/lib/generators/active_admin/webpacker/plugins/jquery.js +7 -0
- data/lib/generators/active_admin/webpacker/templates/active_admin.js +5 -0
- data/lib/generators/active_admin/webpacker/templates/active_admin.scss +17 -0
- data/lib/generators/active_admin/webpacker/templates/print.scss +2 -0
- data/lib/generators/active_admin/webpacker/webpacker_generator.rb +27 -0
- data/lib/ransack_ext.rb +9 -8
- metadata +64 -132
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/base.es6 +0 -23
- data/app/assets/javascripts/active_admin/initializers/filters.es6 +0 -45
- data/app/assets/javascripts/active_admin/lib/active_admin.es6 +0 -41
- data/app/assets/javascripts/active_admin/lib/per_page.es6 +0 -47
- data/docs/.gitignore +0 -1
- data/docs/0-installation.md +0 -118
- data/docs/1-general-configuration.md +0 -204
- data/docs/10-custom-pages.md +0 -150
- data/docs/11-decorators.md +0 -59
- 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 -466
- 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 -227
- data/docs/3-index-pages.md +0 -328
- data/docs/4-csv-format.md +0 -74
- data/docs/5-forms.md +0 -232
- data/docs/6-show-pages.md +0 -81
- 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 -249
- data/docs/README.md +0 -24
- data/docs/_config.yml +0 -2
- 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 -125
- data/docs/stylesheets/main.css +0 -1176
- /data/app/{assets/javascripts/active_admin/ext/jquery-ui.es6 → javascript/active_admin/ext/jquery-ui.js} +0 -0
- /data/app/{assets/javascripts/active_admin/ext/jquery.es6 → javascript/active_admin/ext/jquery.js} +0 -0
- /data/app/{assets/javascripts/active_admin/initializers/datepicker.es6 → javascript/active_admin/initializers/datepicker.js} +0 -0
- /data/app/{assets/javascripts/active_admin/initializers/tabs.es6 → javascript/active_admin/initializers/tabs.js} +0 -0
@@ -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.
|
data/docs/14-gotchas.md
DELETED
@@ -1,138 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/14-gotchas.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Gotchas
|
6
|
-
|
7
|
-
## Security
|
8
|
-
|
9
|
-
### Spreadsheet applications vulnerable to unescaped CSV data
|
10
|
-
|
11
|
-
If your CSV export includes untrusted data provided by your users, it's possible
|
12
|
-
that they could include an executable formula that could call arbitrary commands
|
13
|
-
on your computer. See
|
14
|
-
[#4256](https://github.com/activeadmin/activeadmin/issues/4256) for more
|
15
|
-
details.
|
16
|
-
|
17
|
-
## Session Commits & Asset Pipeline
|
18
|
-
|
19
|
-
When configuring the asset pipeline ensure that the asset prefix
|
20
|
-
(`config.assets.prefix`) is not the same as the namespace of ActiveAdmin
|
21
|
-
(default namespace is `/admin`). If they are the same Sprockets will prevent the
|
22
|
-
session from being committed. Flash messages won't work and you will be unable to
|
23
|
-
use the session for storing anything.
|
24
|
-
|
25
|
-
For more information see [the following
|
26
|
-
post](http://www.intridea.com/blog/2013/3/20/rails-assets-prefix-may-disable-your-session).
|
27
|
-
|
28
|
-
## Helpers
|
29
|
-
|
30
|
-
There are two known gotchas with helpers. This hopefully will help you to
|
31
|
-
find a solution.
|
32
|
-
|
33
|
-
### Helpers are not reloading in development
|
34
|
-
|
35
|
-
This is a known and still open
|
36
|
-
[issue](https://github.com/activeadmin/activeadmin/issues/697) the only way is
|
37
|
-
to restart your server each time you change a helper.
|
38
|
-
|
39
|
-
### Helper maybe not included by default
|
40
|
-
|
41
|
-
If you use `config.action_controller.include_all_helpers = false` in your
|
42
|
-
application config, you need to include it by hand.
|
43
|
-
|
44
|
-
#### Solutions
|
45
|
-
|
46
|
-
##### First use a monkey patch
|
47
|
-
|
48
|
-
This works for all ActiveAdmin resources at once.
|
49
|
-
|
50
|
-
```ruby
|
51
|
-
# config/initializers/active_admin_helpers.rb
|
52
|
-
ActiveAdmin::BaseController.class_eval do
|
53
|
-
helper ApplicationHelper
|
54
|
-
end
|
55
|
-
```
|
56
|
-
|
57
|
-
##### Second use the `controller` method
|
58
|
-
|
59
|
-
This works only for one resource at a time.
|
60
|
-
|
61
|
-
```ruby
|
62
|
-
ActiveAdmin.register User do
|
63
|
-
controller do
|
64
|
-
helper UserHelper
|
65
|
-
end
|
66
|
-
end
|
67
|
-
```
|
68
|
-
|
69
|
-
## CSS
|
70
|
-
|
71
|
-
In order to avoid the override of your application style with the Active Admin
|
72
|
-
one, you can do one of these things:
|
73
|
-
|
74
|
-
* You can properly move the generated file `active_admin.scss` from
|
75
|
-
`app/assets/stylesheets` to `vendor/assets/stylesheets`.
|
76
|
-
* You can remove all `require_tree` commands from your root level css files,
|
77
|
-
where the `active_admin.scss` is in the tree.
|
78
|
-
|
79
|
-
## Conflicts
|
80
|
-
|
81
|
-
### With gems that provides a `search` class method on a model
|
82
|
-
|
83
|
-
If a gem defines a `search` class method on a model, this can result in conflicts
|
84
|
-
with the same method provided by `ransack` (a dependency of ActiveAdmin).
|
85
|
-
|
86
|
-
Each of this conflicts need to solved is a different way. Some solutions are
|
87
|
-
listed below.
|
88
|
-
|
89
|
-
#### `tire`, `retire` and `elasticsearch-rails`
|
90
|
-
|
91
|
-
This conflict can be solved, by using explicitly the `search` method of `tire`,
|
92
|
-
`retire` or `elasticsearch-rails`:
|
93
|
-
|
94
|
-
##### For `tire` and `retire`
|
95
|
-
|
96
|
-
```ruby
|
97
|
-
YourModel.tire.search
|
98
|
-
```
|
99
|
-
|
100
|
-
##### For `elasticsearch-rails`
|
101
|
-
|
102
|
-
```ruby
|
103
|
-
YourModel.__elasticsearch__.search
|
104
|
-
```
|
105
|
-
|
106
|
-
### Sunspot Solr
|
107
|
-
|
108
|
-
```ruby
|
109
|
-
YourModel.solr_search
|
110
|
-
```
|
111
|
-
|
112
|
-
### Rails 5 scaffold generators
|
113
|
-
|
114
|
-
Active Admin requires the `inherited_resources` gem which may break scaffolding
|
115
|
-
under Rails 5 as it replaces the default scaffold generator. The solution is to
|
116
|
-
configure the default controller in `config/application.rb` as outlined in
|
117
|
-
[activeadmin/inherited_resources#195](https://github.com/activeadmin/inherited_resources/issues/195)
|
118
|
-
|
119
|
-
```ruby
|
120
|
-
module SampleApp
|
121
|
-
class Application < Rails::Application
|
122
|
-
...
|
123
|
-
config.app_generators.scaffold_controller = :scaffold_controller
|
124
|
-
...
|
125
|
-
end
|
126
|
-
end
|
127
|
-
```
|
128
|
-
|
129
|
-
## Authentication & Application Controller
|
130
|
-
|
131
|
-
The `ActiveAdmin::BaseController` inherits from the `ApplicationController`. Any
|
132
|
-
authentication method(s) specified in the `ApplicationController` callbacks will
|
133
|
-
be called instead of the authentication method in the active admin config file.
|
134
|
-
For example, if the ApplicationController has a callback `before_action
|
135
|
-
:custom_authentication_method` and the config file's authentication method is
|
136
|
-
`config.authentication_method = :authenticate_active_admin_user`, then
|
137
|
-
`custom_authentication_method` will be called instead of
|
138
|
-
`authenticate_active_admin_user`.
|