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,466 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/2-resource-customization.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Working with Resources
|
6
|
-
|
7
|
-
Every Active Admin resource corresponds to a Rails model. So before creating a
|
8
|
-
resource you must first create a Rails model for it.
|
9
|
-
|
10
|
-
## Create a Resource
|
11
|
-
|
12
|
-
The basic command for creating a resource is `rails g active_admin:resource Post`.
|
13
|
-
The generator will produce an empty `app/admin/posts.rb` file like so:
|
14
|
-
|
15
|
-
```ruby
|
16
|
-
ActiveAdmin.register Post do
|
17
|
-
# everything happens here :D
|
18
|
-
end
|
19
|
-
```
|
20
|
-
|
21
|
-
## Setting up Strong Parameters
|
22
|
-
|
23
|
-
Use the `permit_params` method to define which attributes may be changed:
|
24
|
-
|
25
|
-
```ruby
|
26
|
-
ActiveAdmin.register Post do
|
27
|
-
permit_params :title, :content, :publisher_id
|
28
|
-
end
|
29
|
-
```
|
30
|
-
|
31
|
-
Any form field that sends multiple values (such as a HABTM association, or an
|
32
|
-
array attribute) needs to pass an empty array to `permit_params`:
|
33
|
-
|
34
|
-
If your HABTM is `roles`, you should permit `role_ids: []`
|
35
|
-
|
36
|
-
```ruby
|
37
|
-
ActiveAdmin.register Post do
|
38
|
-
permit_params :title, :content, :publisher_id, role_ids: []
|
39
|
-
end
|
40
|
-
```
|
41
|
-
|
42
|
-
Nested associations in the same form also require an array, but it
|
43
|
-
needs to be filled with any attributes used.
|
44
|
-
|
45
|
-
```ruby
|
46
|
-
ActiveAdmin.register Post do
|
47
|
-
permit_params :title, :content, :publisher_id,
|
48
|
-
tags_attributes: [:id, :name, :description, :_destroy]
|
49
|
-
end
|
50
|
-
|
51
|
-
# Note that `accepts_nested_attributes_for` is still required:
|
52
|
-
class Post < ActiveRecord::Base
|
53
|
-
accepts_nested_attributes_for :tags, allow_destroy: true
|
54
|
-
end
|
55
|
-
```
|
56
|
-
|
57
|
-
If you want to dynamically choose which attributes can be set, pass a block:
|
58
|
-
|
59
|
-
```ruby
|
60
|
-
ActiveAdmin.register Post do
|
61
|
-
permit_params do
|
62
|
-
params = [:title, :content, :publisher_id]
|
63
|
-
params.push :author_id if current_user.admin?
|
64
|
-
params
|
65
|
-
end
|
66
|
-
end
|
67
|
-
```
|
68
|
-
|
69
|
-
If your resource is nested, declare `permit_params` after `belongs_to`:
|
70
|
-
|
71
|
-
```ruby
|
72
|
-
ActiveAdmin.register Post do
|
73
|
-
belongs_to :user
|
74
|
-
permit_params :title, :content, :publisher_id
|
75
|
-
end
|
76
|
-
```
|
77
|
-
|
78
|
-
The `permit_params` call creates a method called `permitted_params`. You should
|
79
|
-
use this method when overriding `create` or `update` actions:
|
80
|
-
|
81
|
-
```ruby
|
82
|
-
ActiveAdmin.register Post do
|
83
|
-
controller do
|
84
|
-
def create
|
85
|
-
# Good
|
86
|
-
@post = Post.new(permitted_params[:post])
|
87
|
-
# Bad
|
88
|
-
@post = Post.new(params[:post])
|
89
|
-
|
90
|
-
if @post.save
|
91
|
-
# ...
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
```
|
97
|
-
|
98
|
-
## Disabling Actions on a Resource
|
99
|
-
|
100
|
-
All CRUD actions are enabled by default. These can be disabled for a given resource:
|
101
|
-
|
102
|
-
```ruby
|
103
|
-
ActiveAdmin.register Post do
|
104
|
-
actions :all, except: [:update, :destroy]
|
105
|
-
end
|
106
|
-
```
|
107
|
-
|
108
|
-
## Renaming Action Items
|
109
|
-
|
110
|
-
You can use translations to override labels and page titles for actions such as
|
111
|
-
new, edit, and destroy by providing a resource specific translation. For
|
112
|
-
example, to change 'New Offer' to 'Make an Offer' add the following in
|
113
|
-
config/locales/[en].yml:
|
114
|
-
|
115
|
-
```yaml
|
116
|
-
en:
|
117
|
-
active_admin:
|
118
|
-
resources:
|
119
|
-
offer: # Registered resource
|
120
|
-
new_model: 'Make an Offer' # new action item
|
121
|
-
edit_model: 'Change Offer' # edit action item
|
122
|
-
delete_model: 'Cancel Offer' # delete action item
|
123
|
-
```
|
124
|
-
|
125
|
-
See the [default en.yml](/config/locales/en.yml) locale file for
|
126
|
-
existing translations and examples.
|
127
|
-
|
128
|
-
## Rename the Resource
|
129
|
-
|
130
|
-
By default, any references to the resource (menu, routes, buttons, etc) in the
|
131
|
-
interface will use the name of the class. You can rename the resource by using
|
132
|
-
the `:as` option.
|
133
|
-
|
134
|
-
```ruby
|
135
|
-
ActiveAdmin.register Post, as: "Article"
|
136
|
-
```
|
137
|
-
|
138
|
-
The resource will then be available at `/admin/articles`.
|
139
|
-
|
140
|
-
## Customize the Namespace
|
141
|
-
|
142
|
-
We use the `admin` namespace by default, but you can use anything:
|
143
|
-
|
144
|
-
```ruby
|
145
|
-
# Available at /today/posts
|
146
|
-
ActiveAdmin.register Post, namespace: :today
|
147
|
-
|
148
|
-
# Available at /posts
|
149
|
-
ActiveAdmin.register Post, namespace: false
|
150
|
-
```
|
151
|
-
|
152
|
-
## Customize the Menu
|
153
|
-
|
154
|
-
The resource will be displayed in the global navigation by default. To disable
|
155
|
-
the resource from being displayed in the global navigation:
|
156
|
-
|
157
|
-
```ruby
|
158
|
-
ActiveAdmin.register Post do
|
159
|
-
menu false
|
160
|
-
end
|
161
|
-
```
|
162
|
-
|
163
|
-
The menu method accepts a hash with the following options:
|
164
|
-
|
165
|
-
* `:label` - The string or proc label to display in the menu. If it's a proc, it
|
166
|
-
will be called each time the menu is rendered.
|
167
|
-
* `:parent` - The string id (or label) of the parent used for this menu
|
168
|
-
* `:if` - A block or a symbol of a method to call to decide if the menu item
|
169
|
-
should be displayed
|
170
|
-
* `:priority` - The integer value of the priority, which defaults to `10`
|
171
|
-
|
172
|
-
### Labels
|
173
|
-
|
174
|
-
To change the name of the label in the menu:
|
175
|
-
|
176
|
-
```ruby
|
177
|
-
ActiveAdmin.register Post do
|
178
|
-
menu label: "My Posts"
|
179
|
-
end
|
180
|
-
```
|
181
|
-
|
182
|
-
If you want something more dynamic, pass a proc instead:
|
183
|
-
|
184
|
-
```ruby
|
185
|
-
ActiveAdmin.register Post do
|
186
|
-
menu label: proc{ I18n.t "mypost" }
|
187
|
-
end
|
188
|
-
```
|
189
|
-
|
190
|
-
### Menu Priority
|
191
|
-
|
192
|
-
Menu items are sorted first by their numeric priority, then alphabetically. Since
|
193
|
-
every menu by default has a priority of `10`, the menu is normally alphabetical.
|
194
|
-
|
195
|
-
You can easily customize this:
|
196
|
-
|
197
|
-
```ruby
|
198
|
-
ActiveAdmin.register Post do
|
199
|
-
menu priority: 1 # so it's on the very left
|
200
|
-
end
|
201
|
-
```
|
202
|
-
|
203
|
-
### Conditionally Showing / Hiding Menu Items
|
204
|
-
|
205
|
-
Menu items can be shown or hidden at runtime using the `:if` option.
|
206
|
-
|
207
|
-
```ruby
|
208
|
-
ActiveAdmin.register Post do
|
209
|
-
menu if: proc{ current_user.can_edit_posts? }
|
210
|
-
end
|
211
|
-
```
|
212
|
-
|
213
|
-
The proc will be called in the context of the view, so you have access to all
|
214
|
-
your helpers and current user session information.
|
215
|
-
|
216
|
-
### Drop Down Menus
|
217
|
-
|
218
|
-
In many cases, a single level navigation will not be enough to manage a large
|
219
|
-
application. In that case, you can group your menu items under a parent menu item.
|
220
|
-
|
221
|
-
```ruby
|
222
|
-
ActiveAdmin.register Post do
|
223
|
-
menu parent: "Blog"
|
224
|
-
end
|
225
|
-
```
|
226
|
-
|
227
|
-
Note that the "Blog" parent menu item doesn't even have to exist yet; it can be
|
228
|
-
dynamically generated for you.
|
229
|
-
|
230
|
-
### Customizing Parent Menu Items
|
231
|
-
|
232
|
-
All of the options given to a standard menu item are also available to
|
233
|
-
parent menu items. In the case of complex parent menu items, you should
|
234
|
-
configure them in the Active Admin initializer.
|
235
|
-
|
236
|
-
```ruby
|
237
|
-
# config/initializers/active_admin.rb
|
238
|
-
config.namespace :admin do |admin|
|
239
|
-
admin.build_menu do |menu|
|
240
|
-
menu.add label: 'Blog', priority: 0
|
241
|
-
end
|
242
|
-
end
|
243
|
-
|
244
|
-
# app/admin/post.rb
|
245
|
-
ActiveAdmin.register Post do
|
246
|
-
menu parent: 'Blog'
|
247
|
-
end
|
248
|
-
```
|
249
|
-
|
250
|
-
### Dynamic Parent Menu Items
|
251
|
-
|
252
|
-
While the above works fine, what if you want a parent menu item with a dynamic
|
253
|
-
name? Well, you have to refer to it by its `:id`.
|
254
|
-
|
255
|
-
```ruby
|
256
|
-
# config/initializers/active_admin.rb
|
257
|
-
config.namespace :admin do |admin|
|
258
|
-
admin.build_menu do |menu|
|
259
|
-
menu.add id: 'blog', label: proc{"Something dynamic"}, priority: 0
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
# app/admin/post.rb
|
264
|
-
ActiveAdmin.register Post do
|
265
|
-
menu parent: 'blog'
|
266
|
-
end
|
267
|
-
```
|
268
|
-
|
269
|
-
### Adding Custom Menu Items
|
270
|
-
|
271
|
-
Sometimes it's not enough to just customize the menu label. In this case, you
|
272
|
-
can customize the menu for the namespace within the Active Admin initializer.
|
273
|
-
|
274
|
-
```ruby
|
275
|
-
# config/initializers/active_admin.rb
|
276
|
-
config.namespace :admin do |admin|
|
277
|
-
admin.build_menu do |menu|
|
278
|
-
menu.add label: "The Application", url: "/", priority: 0
|
279
|
-
|
280
|
-
menu.add label: "Sites" do |sites|
|
281
|
-
sites.add label: "Google",
|
282
|
-
url: "http://google.com",
|
283
|
-
html_options: { target: :blank }
|
284
|
-
|
285
|
-
sites.add label: "Facebook",
|
286
|
-
url: "http://facebook.com"
|
287
|
-
|
288
|
-
sites.add label: "Github",
|
289
|
-
url: "http://github.com"
|
290
|
-
end
|
291
|
-
end
|
292
|
-
end
|
293
|
-
```
|
294
|
-
|
295
|
-
This will be registered on application start before your resources are loaded.
|
296
|
-
|
297
|
-
## Scoping the queries
|
298
|
-
|
299
|
-
If your administrators have different access levels, you may sometimes want to
|
300
|
-
scope what they have access to. Assuming your User model has the proper
|
301
|
-
has_many relationships, you can simply scope the listings and finders like so:
|
302
|
-
|
303
|
-
```ruby
|
304
|
-
ActiveAdmin.register Post do
|
305
|
-
scope_to :current_user # limits the accessible posts to `current_user.posts`
|
306
|
-
|
307
|
-
# Or if the association doesn't have the default name:
|
308
|
-
scope_to :current_user, association_method: :blog_posts
|
309
|
-
|
310
|
-
# Finally, you can pass a block to be called:
|
311
|
-
scope_to do
|
312
|
-
User.most_popular_posts
|
313
|
-
end
|
314
|
-
end
|
315
|
-
```
|
316
|
-
|
317
|
-
You can also conditionally apply the scope:
|
318
|
-
|
319
|
-
```ruby
|
320
|
-
ActiveAdmin.register Post do
|
321
|
-
scope_to :current_user, if: proc{ current_user.limited_access? }
|
322
|
-
scope_to :current_user, unless: proc{ current_user.admin? }
|
323
|
-
end
|
324
|
-
```
|
325
|
-
|
326
|
-
## Eager loading
|
327
|
-
|
328
|
-
A common way to increase page performance is to eliminate N+1 queries by eager
|
329
|
-
loading associations:
|
330
|
-
|
331
|
-
```ruby
|
332
|
-
ActiveAdmin.register Post do
|
333
|
-
includes :author, :categories
|
334
|
-
end
|
335
|
-
```
|
336
|
-
|
337
|
-
## Customizing resource retrieval
|
338
|
-
|
339
|
-
Our controllers are built on [Inherited
|
340
|
-
Resources](https://github.com/activeadmin/inherited_resources), so you can use
|
341
|
-
[all of its
|
342
|
-
features](https://github.com/activeadmin/inherited_resources#overwriting-defaults).
|
343
|
-
|
344
|
-
If you need to customize the collection properties, you can overwrite the
|
345
|
-
`scoped_collection` method.
|
346
|
-
|
347
|
-
```ruby
|
348
|
-
ActiveAdmin.register Post do
|
349
|
-
controller do
|
350
|
-
def scoped_collection
|
351
|
-
end_of_association_chain.where(visibility: true)
|
352
|
-
end
|
353
|
-
end
|
354
|
-
end
|
355
|
-
```
|
356
|
-
|
357
|
-
If you need to completely replace the record retrieving code (e.g., you have a
|
358
|
-
custom `to_param` implementation in your models), override the `find_resource` method
|
359
|
-
on the controller:
|
360
|
-
|
361
|
-
```ruby
|
362
|
-
ActiveAdmin.register Post do
|
363
|
-
controller do
|
364
|
-
def find_resource
|
365
|
-
scoped_collection.where(id: params[:id]).first!
|
366
|
-
end
|
367
|
-
end
|
368
|
-
end
|
369
|
-
```
|
370
|
-
|
371
|
-
Note that if you use an authorization library like CanCan, you should be careful
|
372
|
-
to not write code like this, otherwise **your authorization rules won't be
|
373
|
-
applied**:
|
374
|
-
|
375
|
-
```ruby
|
376
|
-
ActiveAdmin.register Post do
|
377
|
-
controller do
|
378
|
-
def find_resource
|
379
|
-
Post.where(id: params[:id]).first!
|
380
|
-
end
|
381
|
-
end
|
382
|
-
end
|
383
|
-
```
|
384
|
-
|
385
|
-
## Belongs To
|
386
|
-
|
387
|
-
It's common to want to scope a series of resources to a relationship. For
|
388
|
-
example a Project may have many Milestones and Tickets. To nest the resource
|
389
|
-
within another, you can use the `belongs_to` method:
|
390
|
-
|
391
|
-
```ruby
|
392
|
-
ActiveAdmin.register Project
|
393
|
-
ActiveAdmin.register Ticket do
|
394
|
-
belongs_to :project
|
395
|
-
end
|
396
|
-
```
|
397
|
-
|
398
|
-
Projects will be available as usual and tickets will be available by visiting
|
399
|
-
`/admin/projects/1/tickets` assuming that a Project with the id of 1 exists.
|
400
|
-
Active Admin does not add "Tickets" to the global navigation because the routes
|
401
|
-
can only be generated when there is a project id.
|
402
|
-
|
403
|
-
To create links to the resource, you can add them to a sidebar (one of the many
|
404
|
-
possibilities for how you may with to handle your user interface):
|
405
|
-
|
406
|
-
```ruby
|
407
|
-
ActiveAdmin.register Project do
|
408
|
-
|
409
|
-
sidebar "Project Details", only: [:show, :edit] do
|
410
|
-
ul do
|
411
|
-
li link_to "Tickets", admin_project_tickets_path(resource)
|
412
|
-
li link_to "Milestones", admin_project_milestones_path(resource)
|
413
|
-
end
|
414
|
-
end
|
415
|
-
end
|
416
|
-
|
417
|
-
ActiveAdmin.register Ticket do
|
418
|
-
belongs_to :project
|
419
|
-
end
|
420
|
-
|
421
|
-
ActiveAdmin.register Milestone do
|
422
|
-
belongs_to :project
|
423
|
-
end
|
424
|
-
```
|
425
|
-
|
426
|
-
In some cases (like Projects), there are many sub resources and you would
|
427
|
-
actually like the global navigation to switch when the user navigates "into" a
|
428
|
-
project. To accomplish this, Active Admin stores the `belongs_to` resources in a
|
429
|
-
separate menu which you can use if you so wish. To use:
|
430
|
-
|
431
|
-
```ruby
|
432
|
-
ActiveAdmin.register Ticket do
|
433
|
-
belongs_to :project
|
434
|
-
navigation_menu :project
|
435
|
-
end
|
436
|
-
|
437
|
-
ActiveAdmin.register Milestone do
|
438
|
-
belongs_to :project
|
439
|
-
navigation_menu :project
|
440
|
-
end
|
441
|
-
```
|
442
|
-
|
443
|
-
Now, when you navigate to the tickets section, the global navigation will
|
444
|
-
only display "Tickets" and "Milestones". When you navigate back to a
|
445
|
-
non-belongs_to resource, it will switch back to the default menu.
|
446
|
-
|
447
|
-
You can also defer the menu lookup until runtime so that you can dynamically show
|
448
|
-
different menus, say perhaps based on user permissions. For example:
|
449
|
-
|
450
|
-
```ruby
|
451
|
-
ActiveAdmin.register Ticket do
|
452
|
-
belongs_to :project
|
453
|
-
navigation_menu do
|
454
|
-
authorized?(:manage, SomeResource) ? :project : :restricted_menu
|
455
|
-
end
|
456
|
-
end
|
457
|
-
```
|
458
|
-
|
459
|
-
If you still want your `belongs_to` resources to be available in the default menu
|
460
|
-
and through non-nested routes, you can use the `:optional` option. For example:
|
461
|
-
|
462
|
-
```ruby
|
463
|
-
ActiveAdmin.register Ticket do
|
464
|
-
belongs_to :project, optional: true
|
465
|
-
end
|
466
|
-
```
|
@@ -1,35 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/3-index-pages/custom-index.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Custom Index
|
6
|
-
|
7
|
-
If the supplied Active Admin index components are insufficient for your project
|
8
|
-
feel free to define your own. Index classes inherit from `ActiveAdmin::Component`
|
9
|
-
and require a `build` method and an `index_name` class method.
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
module ActiveAdmin
|
13
|
-
module Views
|
14
|
-
class IndexAsMyIdea < ActiveAdmin::Component
|
15
|
-
|
16
|
-
def build(page_presenter, collection)
|
17
|
-
# ...
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.index_name
|
21
|
-
"my_idea"
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
```
|
28
|
-
|
29
|
-
The build method takes a PagePresenter object and collection of whatever you
|
30
|
-
choose.
|
31
|
-
|
32
|
-
The `index_name` class method takes no arguments and returns a string that should
|
33
|
-
be representative of the class name. If this method is not defined, your
|
34
|
-
index component will not be able take advantage of Active Admin's
|
35
|
-
*multiple index pages* feature.
|
@@ -1,19 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/3-index-pages/index-as-block.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Index as a Block
|
6
|
-
|
7
|
-
If you want to fully customize the display of your resources on the index
|
8
|
-
screen, Index as a Block allows you to render a block of content for each
|
9
|
-
resource.
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
index as: :block do |product|
|
13
|
-
div for: product do
|
14
|
-
resource_selection_cell product
|
15
|
-
h2 auto_link product.title
|
16
|
-
div simple_format product.description
|
17
|
-
end
|
18
|
-
end
|
19
|
-
```
|
@@ -1,69 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/3-index-pages/index-as-blog.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Index as Blog
|
6
|
-
|
7
|
-
Render your index page as a set of posts. The post has two main options:
|
8
|
-
title and body.
|
9
|
-
|
10
|
-
```ruby
|
11
|
-
index as: :blog do
|
12
|
-
title :my_title # Calls #my_title on each resource
|
13
|
-
body :my_body # Calls #my_body on each resource
|
14
|
-
end
|
15
|
-
```
|
16
|
-
|
17
|
-
## Post Title
|
18
|
-
|
19
|
-
The title is the content that will be rendered within a link to the
|
20
|
-
resource. There are two main ways to set the content for the title
|
21
|
-
|
22
|
-
First, you can pass in a method to be called on your resource. For example:
|
23
|
-
|
24
|
-
```ruby
|
25
|
-
index as: :blog do
|
26
|
-
title :a_method_to_call
|
27
|
-
end
|
28
|
-
```
|
29
|
-
|
30
|
-
Second, you can pass a block to the tile option which will then be
|
31
|
-
used as the contents of the title. The resource being rendered
|
32
|
-
is passed in to the block. For Example:
|
33
|
-
|
34
|
-
```ruby
|
35
|
-
index as: :blog do
|
36
|
-
title do |post|
|
37
|
-
span post.title, class: 'title'
|
38
|
-
span post.created_at, class: 'created_at'
|
39
|
-
end
|
40
|
-
end
|
41
|
-
```
|
42
|
-
|
43
|
-
## Post Body
|
44
|
-
|
45
|
-
The body is rendered underneath the title of each post. The same two
|
46
|
-
style of options work as the Post Title above.
|
47
|
-
|
48
|
-
Call a method on the resource as the body:
|
49
|
-
|
50
|
-
```ruby
|
51
|
-
index as: :blog do
|
52
|
-
title :my_title
|
53
|
-
body :my_body
|
54
|
-
end
|
55
|
-
```
|
56
|
-
|
57
|
-
Or, render a block as the body:
|
58
|
-
|
59
|
-
```ruby
|
60
|
-
index as: :blog do
|
61
|
-
title :my_title
|
62
|
-
body do |post|
|
63
|
-
div truncate post.title
|
64
|
-
div class: 'meta' do
|
65
|
-
span "Post in #{post.categories.join(', ')}"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
```
|
@@ -1,27 +0,0 @@
|
|
1
|
-
---
|
2
|
-
redirect_from: /docs/3-index-pages/index-as-grid.html
|
3
|
-
---
|
4
|
-
|
5
|
-
# Index as a Grid
|
6
|
-
|
7
|
-
Sometimes you want to display the index screen for a set of resources as a grid
|
8
|
-
(possibly a grid of thumbnail images). To do so, use the :grid option for the
|
9
|
-
index block.
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
index as: :grid do |product|
|
13
|
-
link_to image_tag(product.image_path), admin_product_path(product)
|
14
|
-
end
|
15
|
-
```
|
16
|
-
|
17
|
-
The block is rendered within a cell in the grid once for each resource in the
|
18
|
-
collection. The resource is passed into the block for you to use in the view.
|
19
|
-
|
20
|
-
You can customize the number of columns that are rendered using the columns
|
21
|
-
option:
|
22
|
-
|
23
|
-
```ruby
|
24
|
-
index as: :grid, columns: 5 do |product|
|
25
|
-
link_to image_tag(product.image_path), admin_product_path(product)
|
26
|
-
end
|
27
|
-
```
|