activeadmin 2.6.1 → 3.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +438 -9
- data/CONTRIBUTING.md +12 -36
- data/README.md +8 -8
- data/app/assets/javascripts/active_admin/base.js +27 -25
- data/app/assets/stylesheets/active_admin/_base.scss +53 -37
- data/app/assets/stylesheets/active_admin/_forms.scss +2 -13
- data/app/assets/stylesheets/active_admin/_header.scss +37 -3
- data/app/assets/stylesheets/active_admin/_normalize.scss +25 -123
- 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 +7 -5
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +5 -2
- data/app/assets/stylesheets/active_admin/components/_table_tools.scss +9 -6
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +10 -7
- data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +2 -2
- data/app/assets/stylesheets/active_admin/mixins/_variables.scss +12 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +1 -1
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +6 -1
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +6 -4
- data/app/javascript/active_admin/initializers/has-many.js +4 -1
- data/app/javascript/active_admin/initializers/per-page.js +1 -1
- data/app/javascript/active_admin/lib/checkbox-toggler.js +3 -3
- data/app/javascript/active_admin/lib/dropdown-menu.js +1 -1
- data/app/javascript/active_admin/lib/modal-dialog.js +7 -7
- data/app/javascript/active_admin/lib/per-page.js +1 -1
- data/app/javascript/active_admin/lib/table-checkbox-toggler.js +1 -1
- 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/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 -13
- data/config/locales/az.yml +0 -7
- data/config/locales/bg.yml +0 -7
- data/config/locales/bs.yml +0 -7
- data/config/locales/ca.yml +0 -7
- data/config/locales/cs.yml +0 -7
- data/config/locales/da.yml +0 -7
- data/config/locales/de-CH.yml +0 -7
- data/config/locales/de.yml +0 -8
- data/config/locales/el.yml +0 -7
- data/config/locales/en-CA.yml +0 -7
- data/config/locales/en-GB.yml +0 -7
- data/config/locales/en.yml +0 -8
- data/config/locales/eo.yml +0 -8
- data/config/locales/es-MX.yml +2 -8
- data/config/locales/es.yml +2 -10
- data/config/locales/fa.yml +0 -7
- data/config/locales/fi.yml +0 -7
- data/config/locales/fr.yml +3 -11
- data/config/locales/he.yml +0 -9
- data/config/locales/hr.yml +0 -7
- data/config/locales/hu.yml +0 -8
- data/config/locales/id.yml +0 -7
- data/config/locales/it.yml +18 -8
- data/config/locales/ja.yml +2 -10
- data/config/locales/ko.yml +1 -8
- data/config/locales/lt.yml +0 -8
- data/config/locales/lv.yml +0 -7
- data/config/locales/mk.yml +0 -8
- data/config/locales/nb.yml +0 -8
- data/config/locales/nl.yml +1 -9
- data/config/locales/pl.yml +0 -8
- data/config/locales/pt-BR.yml +0 -8
- data/config/locales/pt-PT.yml +0 -7
- data/config/locales/ro.yml +3 -9
- data/config/locales/ru.yml +0 -6
- data/config/locales/sk.yml +0 -8
- data/config/locales/sv-SE.yml +58 -39
- data/config/locales/tr.yml +0 -11
- data/config/locales/uk.yml +0 -6
- data/config/locales/vi.yml +38 -19
- data/config/locales/zh-CN.yml +34 -23
- data/config/locales/zh-TW.yml +0 -7
- data/lib/active_admin/abstract_view_factory.rb +1 -0
- data/lib/active_admin/application.rb +19 -19
- 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 +25 -17
- data/lib/active_admin/dependency.rb +12 -15
- 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 +17 -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 +6 -6
- 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 +9 -8
- data/lib/active_admin/filters/formtastic_addons.rb +3 -7
- data/lib/active_admin/filters/resource_extension.rb +6 -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 +2 -1
- 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 +7 -6
- 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 +3 -2
- data/lib/active_admin/inputs/filters/numeric_input.rb +2 -1
- data/lib/active_admin/inputs/filters/select_input.rb +5 -2
- data/lib/active_admin/inputs/filters/string_input.rb +2 -1
- 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 +8 -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 +16 -15
- data/lib/active_admin/namespace_settings.rb +9 -5
- data/lib/active_admin/order_clause.rb +2 -1
- data/lib/active_admin/orm/active_record/comments/comment.rb +12 -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 +58 -16
- data/lib/active_admin/resource/action_items.rb +6 -5
- data/lib/active_admin/resource/attributes.rb +9 -1
- data/lib/active_admin/resource/belongs_to.rb +3 -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 +1 -0
- data/lib/active_admin/resource/naming.rb +5 -4
- 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 +6 -7
- 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 +20 -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 +7 -28
- data/lib/active_admin/resource_controller/polymorphic_routes.rb +1 -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 +13 -11
- 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 +23 -8
- 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 +8 -11
- 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 +19 -18
- 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 +18 -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 +16 -19
- data/lib/active_admin/views/pages/base.rb +17 -11
- data/lib/active_admin/views/pages/form.rb +1 -0
- data/lib/active_admin/views/pages/index.rb +15 -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 +2 -7
- 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 -61
- 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 +27 -3
- 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/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/vendor/assets/javascripts/jquery-ui/data.js +12 -8
- data/vendor/assets/javascripts/jquery-ui/disable-selection.js +10 -7
- data/vendor/assets/javascripts/jquery-ui/focusable.js +12 -9
- data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +60 -57
- data/vendor/assets/javascripts/jquery-ui/form.js +15 -12
- data/vendor/assets/javascripts/jquery-ui/ie.js +5 -2
- data/vendor/assets/javascripts/jquery-ui/keycode.js +11 -7
- data/vendor/assets/javascripts/jquery-ui/labels.js +46 -40
- data/vendor/assets/javascripts/jquery-ui/plugin.js +5 -2
- data/vendor/assets/javascripts/jquery-ui/position.js +30 -17
- data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +6 -2
- data/vendor/assets/javascripts/jquery-ui/safe-blur.js +6 -2
- data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +10 -7
- data/vendor/assets/javascripts/jquery-ui/tabbable.js +11 -8
- data/vendor/assets/javascripts/jquery-ui/unique-id.js +10 -7
- data/vendor/assets/javascripts/jquery-ui/version.js +6 -3
- data/vendor/assets/javascripts/jquery-ui/widget.js +53 -30
- data/vendor/assets/javascripts/jquery-ui/widgets/button.js +87 -24
- data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +276 -273
- data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +15 -11
- data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +182 -62
- data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +53 -36
- data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +28 -19
- data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +22 -11
- data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +47 -26
- data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +186 -125
- data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +20 -20
- metadata +48 -114
- data/docs/.gitignore +0 -1
- data/docs/0-installation.md +0 -118
- data/docs/1-general-configuration.md +0 -224
- 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 -234
- 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 -3
- data/docs/Gemfile.lock +0 -248
- 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
- data/lib/active_admin/deprecation.rb +0 -10
- data/lib/ransack_ext.rb +0 -20
- data/vendor/assets/javascripts/jquery-ui/escape-selector.js +0 -23
- /data/app/assets/stylesheets/active_admin/{print.scss → _print.scss} +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`.
|