yousty-activeadmin 1.0.4.pre → 1.0.5.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +261 -211
- data/CONTRIBUTING.md +73 -39
- data/Gemfile +38 -20
- data/Guardfile +1 -0
- data/LICENSE +1 -1
- data/README.md +48 -24
- data/Rakefile +12 -4
- data/activeadmin.gemspec +21 -26
- data/app/assets/javascripts/active_admin/application.js.coffee +34 -5
- data/app/assets/javascripts/active_admin/base.js.coffee +11 -2
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +3 -4
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +51 -55
- data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
- data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
- data/app/assets/javascripts/active_admin/lib/popover.js.coffee +29 -58
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +2 -3
- data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
- data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +51 -15
- data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
- data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
- data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
- data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
- data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -12
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +3 -1
- data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
- data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +0 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
- data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +1 -0
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
- data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_gradients.css.scss → _gradients.scss} +1 -1
- data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
- data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_rounded.css.scss → _rounded.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +7 -1
- data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -0
- data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
- data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +10 -7
- data/app/views/active_admin/devise/confirmations/new.html.erb +15 -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 +1 -1
- data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
- data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
- data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +8 -8
- data/app/views/active_admin/devise/shared/_links.erb +1 -1
- data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
- data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
- data/config/locales/ar.yml +120 -0
- data/config/locales/bg.yml +26 -6
- data/config/locales/bs.yml +122 -0
- data/config/locales/ca.yml +10 -1
- data/config/locales/cs.yml +7 -2
- data/config/locales/da.yml +7 -3
- data/config/locales/de-CH.yml +14 -31
- data/config/locales/de.yml +33 -33
- data/config/locales/el.yml +127 -0
- data/config/locales/en-GB.yml +11 -4
- data/config/locales/en.yml +21 -4
- data/config/locales/{es_MX.yml → es-MX.yml} +14 -24
- data/config/locales/es.yml +32 -25
- data/config/locales/fa.yml +120 -0
- data/config/locales/fi.yml +9 -5
- data/config/locales/fr.yml +28 -12
- data/config/locales/he.yml +7 -3
- data/config/locales/hr.yml +42 -11
- data/config/locales/hu.yml +10 -3
- data/config/locales/it.yml +31 -3
- data/config/locales/ja.yml +17 -4
- data/config/locales/ko.yml +7 -1
- data/config/locales/lt.yml +42 -11
- data/config/locales/lv.yml +7 -3
- data/config/locales/{no-NB.yml → nb.yml} +46 -15
- data/config/locales/nl.yml +36 -5
- data/config/locales/pl.yml +13 -8
- data/config/locales/pt-BR.yml +36 -5
- data/config/locales/pt-PT.yml +8 -4
- data/config/locales/ro.yml +7 -3
- data/config/locales/ru.yml +26 -5
- data/config/locales/sv-SE.yml +9 -5
- data/config/locales/tr.yml +10 -3
- data/config/locales/uk.yml +36 -12
- data/config/locales/vi.yml +7 -3
- data/config/locales/zh-CN.yml +26 -10
- data/config/locales/zh-TW.yml +19 -13
- data/docs/0-installation.md +14 -6
- data/docs/1-general-configuration.md +8 -5
- data/docs/10-custom-pages.md +68 -70
- data/docs/11-decorators.md +48 -59
- data/docs/12-arbre-components.md +79 -73
- data/docs/13-authorization-adapter.md +128 -107
- data/docs/14-gotchas.md +90 -0
- data/docs/2-resource-customization.md +82 -15
- data/docs/3-index-pages.md +71 -12
- data/docs/3-index-pages/custom-index.md +31 -0
- data/docs/3-index-pages/index-as-table.md +45 -2
- data/docs/4-csv-format.md +1 -1
- data/docs/5-forms.md +78 -29
- data/docs/6-show-pages.md +31 -3
- data/docs/7-sidebars.md +46 -25
- data/docs/8-custom-actions.md +98 -77
- data/docs/9-batch-actions.md +211 -133
- data/docs/README.md +24 -0
- data/features/action_item.feature +3 -3
- data/features/authorization_pundit.feature +37 -0
- data/features/belongs_to.feature +3 -0
- data/features/breadcrumb.feature +48 -0
- data/features/comments/commenting.feature +44 -13
- data/features/development_reloading.feature +3 -4
- data/features/edit_page.feature +9 -19
- data/features/favicon.feature +3 -3
- data/features/i18n.feature +5 -0
- data/features/index/batch_actions.feature +41 -0
- data/features/index/filters.feature +23 -0
- data/features/index/format_as_csv.feature +90 -4
- data/features/index/index_as_blog.feature +4 -4
- data/features/index/index_as_table.feature +102 -6
- data/features/index/index_blank_slate.feature +22 -0
- data/features/index/index_scope_to.feature +16 -16
- data/features/index/page_title.feature +11 -0
- data/features/index/pagination.feature +1 -1
- data/features/index/switch_index_view.feature +14 -14
- data/features/new_page.feature +10 -20
- data/features/registering_pages.feature +1 -1
- data/features/renamed_resource.feature +32 -0
- data/features/show/page_title.feature +11 -0
- data/features/show/tabs.feature +27 -0
- data/features/sidebar_sections.feature +12 -0
- data/features/specifying_actions.feature +3 -3
- data/features/step_definitions/action_item_steps.rb +2 -2
- data/features/step_definitions/action_link_steps.rb +14 -1
- data/features/step_definitions/additional_web_steps.rb +17 -18
- data/features/step_definitions/asset_steps.rb +3 -3
- data/features/step_definitions/attribute_steps.rb +8 -3
- data/features/step_definitions/batch_action_steps.rb +26 -9
- data/features/step_definitions/blog_steps.rb +3 -0
- data/features/step_definitions/breadcrumb_steps.rb +1 -1
- data/features/step_definitions/comment_steps.rb +1 -1
- data/features/step_definitions/configuration_steps.rb +1 -1
- data/features/step_definitions/dashboard_steps.rb +2 -2
- data/features/step_definitions/factory_steps.rb +6 -6
- data/features/step_definitions/filter_steps.rb +25 -3
- data/features/step_definitions/flash_steps.rb +3 -3
- data/features/step_definitions/format_steps.rb +17 -10
- data/features/step_definitions/index_scope_steps.rb +5 -5
- data/features/step_definitions/layout_steps.rb +1 -1
- data/features/step_definitions/member_link_steps.rb +2 -2
- data/features/step_definitions/menu_steps.rb +3 -3
- data/features/step_definitions/pagination_steps.rb +2 -3
- data/features/step_definitions/sidebar_steps.rb +8 -3
- data/features/step_definitions/site_title_steps.rb +6 -4
- data/features/step_definitions/symbol_leak_steps.rb +1 -1
- data/features/step_definitions/tab_steps.rb +5 -0
- data/features/step_definitions/table_steps.rb +4 -4
- data/features/step_definitions/user_steps.rb +15 -9
- data/features/step_definitions/web_steps.rb +10 -11
- data/features/sti_resource.feature +2 -10
- data/features/strong_parameters.feature +73 -0
- data/features/support/env.rb +35 -2
- data/features/support/paths.rb +2 -2
- data/features/support/selectors.rb +1 -1
- data/features/users/resetting_password.feature +7 -7
- data/lib/active_admin.rb +18 -13
- data/lib/active_admin/abstract_view_factory.rb +7 -17
- data/lib/active_admin/application.rb +50 -25
- data/lib/active_admin/asset_registration.rb +2 -2
- data/lib/active_admin/authorization_adapter.rb +2 -2
- data/lib/active_admin/base_controller.rb +2 -3
- data/lib/active_admin/base_controller/authorization.rb +13 -31
- data/lib/active_admin/batch_actions.rb +1 -1
- data/lib/active_admin/batch_actions/controller.rb +13 -7
- data/lib/active_admin/batch_actions/resource_extension.rb +43 -17
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
- data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
- data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
- data/lib/active_admin/callbacks.rb +25 -24
- data/lib/active_admin/cancan_adapter.rb +7 -11
- data/lib/active_admin/csv_builder.rb +92 -15
- data/lib/active_admin/dependency.rb +93 -0
- data/lib/active_admin/deprecation.rb +6 -7
- data/lib/active_admin/devise.rb +26 -14
- data/lib/active_admin/dsl.rb +18 -11
- data/lib/active_admin/engine.rb +7 -2
- data/lib/active_admin/error.rb +59 -0
- data/lib/active_admin/filters/dsl.rb +2 -2
- data/lib/active_admin/filters/forms.rb +19 -30
- data/lib/active_admin/filters/formtastic_addons.rb +20 -11
- data/lib/active_admin/filters/resource_extension.rb +16 -9
- data/lib/active_admin/form_builder.rb +94 -105
- data/lib/active_admin/helpers/collection.rb +7 -13
- data/lib/active_admin/helpers/i18n.rb +7 -0
- data/lib/active_admin/helpers/optional_display.rb +5 -5
- data/lib/active_admin/helpers/scope_chain.rb +1 -1
- data/lib/active_admin/helpers/settings.rb +16 -9
- data/lib/active_admin/iconic.rb +17 -15
- data/lib/active_admin/iconic/icons.rb +136 -136
- data/lib/active_admin/inputs.rb +11 -7
- data/lib/active_admin/inputs/datepicker_input.rb +1 -1
- data/lib/active_admin/inputs/filters/base.rb +42 -0
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
- data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
- data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
- data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
- data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
- data/lib/active_admin/inputs/filters/select_input.rb +54 -0
- data/lib/active_admin/inputs/filters/string_input.rb +26 -0
- data/lib/active_admin/menu.rb +3 -3
- data/lib/active_admin/menu_collection.rb +1 -4
- data/lib/active_admin/namespace.rb +52 -29
- data/lib/active_admin/order_clause.rb +26 -0
- data/lib/active_admin/orm/active_record.rb +2 -0
- data/lib/active_admin/orm/active_record/comments.rb +48 -51
- data/lib/active_admin/orm/active_record/comments/comment.rb +16 -10
- data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -1
- data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -1
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +15 -13
- data/lib/active_admin/page.rb +5 -1
- data/lib/active_admin/page_dsl.rb +1 -1
- data/lib/active_admin/page_presenter.rb +2 -2
- data/lib/active_admin/pundit_adapter.rb +68 -0
- data/lib/active_admin/resource.rb +12 -3
- data/lib/active_admin/resource/action_items.rb +15 -8
- data/lib/active_admin/resource/belongs_to.rb +7 -3
- data/lib/active_admin/resource/controllers.rb +1 -0
- data/lib/active_admin/resource/includes.rb +12 -0
- data/lib/active_admin/resource/menu.rb +5 -5
- data/lib/active_admin/resource/naming.rb +25 -47
- data/lib/active_admin/resource/page_presenters.rb +1 -1
- data/lib/active_admin/resource/routes.rb +26 -10
- data/lib/active_admin/resource/scope_to.rb +7 -7
- data/lib/active_admin/resource/sidebars.rb +1 -0
- data/lib/active_admin/resource_collection.rb +44 -16
- data/lib/active_admin/resource_controller.rb +6 -5
- data/lib/active_admin/resource_controller/data_access.rb +87 -82
- data/lib/active_admin/resource_controller/decorators.rb +91 -9
- data/lib/active_admin/resource_controller/streaming.rb +37 -0
- data/lib/active_admin/resource_dsl.rb +54 -10
- data/lib/active_admin/router.rb +7 -7
- data/lib/active_admin/scope.rb +6 -6
- data/lib/active_admin/sidebar_section.rb +10 -2
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_factory.rb +17 -16
- data/lib/active_admin/view_helpers.rb +0 -1
- data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +13 -6
- data/lib/active_admin/view_helpers/display_helper.rb +30 -17
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -24
- data/lib/active_admin/view_helpers/fields_for.rb +2 -2
- data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
- data/lib/active_admin/view_helpers/form_helper.rb +5 -9
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
- data/lib/active_admin/views/action_items.rb +2 -2
- data/lib/active_admin/views/components/action_list_popover.rb +1 -1
- data/lib/active_admin/views/components/active_admin_form.rb +123 -0
- data/lib/active_admin/views/components/attributes_table.rb +22 -13
- data/lib/active_admin/views/components/blank_slate.rb +1 -1
- data/lib/active_admin/views/components/columns.rb +13 -7
- data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
- data/lib/active_admin/views/components/index_list.rb +7 -7
- data/lib/active_admin/views/components/paginated_collection.rb +33 -17
- data/lib/active_admin/views/components/panel.rb +8 -2
- data/lib/active_admin/views/components/popover.rb +1 -1
- data/lib/active_admin/views/components/scopes.rb +1 -1
- data/lib/active_admin/views/components/sidebar_section.rb +3 -2
- data/lib/active_admin/views/components/site_title.rb +2 -2
- data/lib/active_admin/views/components/status_tag.rb +34 -11
- data/lib/active_admin/views/components/table_for.rb +67 -22
- data/lib/active_admin/views/components/tabs.rb +28 -0
- data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
- data/lib/active_admin/views/footer.rb +3 -3
- data/lib/active_admin/views/header.rb +3 -3
- data/lib/active_admin/views/index_as_blog.rb +6 -6
- data/lib/active_admin/views/index_as_grid.rb +2 -2
- data/lib/active_admin/views/index_as_table.rb +127 -40
- data/lib/active_admin/views/pages/base.rb +22 -18
- data/lib/active_admin/views/pages/form.rb +16 -6
- data/lib/active_admin/views/pages/index.rb +36 -20
- data/lib/active_admin/views/pages/layout.rb +1 -1
- data/lib/active_admin/views/pages/show.rb +4 -4
- data/lib/active_admin/views/tabbed_navigation.rb +7 -3
- data/lib/active_admin/views/title_bar.rb +10 -8
- data/lib/generators/active_admin/assets/assets_generator.rb +1 -3
- data/lib/generators/active_admin/devise/devise_generator.rb +20 -28
- data/lib/generators/active_admin/install/install_generator.rb +8 -9
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -22
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -9
- data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
- data/lib/generators/active_admin/page/USAGE +8 -0
- data/lib/generators/active_admin/page/page_generator.rb +12 -0
- data/lib/generators/active_admin/page/templates/page.rb +5 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +2 -4
- data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
- data/lib/ransack_ext.rb +4 -4
- data/script/local +2 -2
- data/script/travis_cache +107 -0
- data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
- data/spec/javascripts/fixtures/flashes.html +2 -0
- data/spec/rails_helper.rb +154 -0
- data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
- data/spec/{integration → requests}/javascript_spec.rb +5 -5
- data/spec/requests/memory_spec.rb +23 -0
- data/spec/requests/stylesheets_spec.rb +18 -0
- data/spec/spec_helper.rb +12 -170
- data/spec/support/detect_rails_version.rb +31 -39
- data/spec/support/rails_template.rb +61 -34
- data/spec/support/rails_template_with_data.rb +14 -14
- data/spec/support/templates/admin/stores.rb +3 -5
- data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
- data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
- data/spec/support/templates/policies/admin_user_policy.rb +11 -0
- data/spec/support/templates/policies/application_policy.rb +45 -0
- data/spec/support/templates/policies/category_policy.rb +7 -0
- data/spec/support/templates/policies/post_policy.rb +15 -0
- data/spec/support/templates/policies/store_policy.rb +11 -0
- data/spec/support/templates/policies/user_policy.rb +11 -0
- data/spec/support/templates/post_decorator.rb +4 -46
- data/spec/unit/abstract_view_factory_spec.rb +11 -11
- data/spec/unit/action_builder_spec.rb +24 -18
- data/spec/unit/active_admin_spec.rb +2 -2
- data/spec/unit/application_spec.rb +30 -31
- data/spec/unit/asset_registration_spec.rb +11 -11
- data/spec/unit/authorization/authorization_adapter_spec.rb +7 -7
- data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
- data/spec/unit/authorization/index_overriding_spec.rb +22 -0
- data/spec/unit/auto_link_spec.rb +42 -5
- data/spec/unit/batch_actions/resource_spec.rb +15 -14
- data/spec/unit/batch_actions/settings_spec.rb +18 -18
- data/spec/unit/belongs_to_spec.rb +26 -17
- data/spec/unit/cancan_adapter_spec.rb +4 -4
- data/spec/unit/comments_spec.rb +99 -39
- data/spec/unit/component_spec.rb +3 -3
- data/spec/unit/config_shared_examples.rb +8 -8
- data/spec/unit/controller_filters_spec.rb +26 -14
- data/spec/unit/csv_builder_spec.rb +152 -24
- data/spec/unit/dependency_spec.rb +135 -0
- data/spec/unit/devise_spec.rb +17 -37
- data/spec/unit/dsl_spec.rb +70 -9
- data/spec/unit/event_spec.rb +9 -9
- data/spec/unit/filters/filter_form_builder_spec.rb +167 -157
- data/spec/unit/filters/resource_spec.rb +35 -33
- data/spec/unit/form_builder_spec.rb +383 -145
- data/spec/unit/generators/install_spec.rb +5 -5
- data/spec/unit/helpers/collection_spec.rb +18 -18
- data/spec/unit/helpers/scope_chain_spec.rb +5 -5
- data/spec/unit/helpers/settings_spec.rb +4 -4
- data/spec/unit/i18n_spec.rb +12 -0
- data/spec/unit/menu_collection_spec.rb +14 -14
- data/spec/unit/menu_item_spec.rb +42 -42
- data/spec/unit/menu_spec.rb +20 -20
- data/spec/unit/namespace/authorization_spec.rb +5 -5
- data/spec/unit/namespace/register_page_spec.rb +9 -9
- data/spec/unit/namespace/register_resource_spec.rb +26 -28
- data/spec/unit/namespace_spec.rb +20 -20
- data/spec/unit/order_clause_spec.rb +81 -0
- data/spec/unit/page_controller_spec.rb +1 -1
- data/spec/unit/page_spec.rb +18 -12
- data/spec/unit/pretty_format_spec.rb +42 -14
- data/spec/unit/pundit_adapter_spec.rb +98 -0
- data/spec/unit/resource/action_items_spec.rb +13 -10
- data/spec/unit/resource/includes_spec.rb +21 -0
- data/spec/unit/resource/menu_spec.rb +1 -1
- data/spec/unit/resource/naming_spec.rb +23 -23
- data/spec/unit/resource/page_presenters_spec.rb +8 -8
- data/spec/unit/resource/pagination_spec.rb +6 -6
- data/spec/unit/resource/routes_spec.rb +10 -10
- data/spec/unit/resource/scopes_spec.rb +14 -7
- data/spec/unit/resource/sidebars_spec.rb +6 -6
- data/spec/unit/resource_collection_spec.rb +66 -68
- data/spec/unit/resource_controller/data_access_spec.rb +39 -21
- data/spec/unit/resource_controller/decorators_spec.rb +83 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
- data/spec/unit/resource_controller_spec.rb +66 -62
- data/spec/unit/resource_registration_spec.rb +12 -12
- data/spec/unit/resource_spec.rb +75 -40
- data/spec/unit/routing_spec.rb +39 -31
- data/spec/unit/scope_spec.rb +112 -30
- data/spec/unit/settings_spec.rb +51 -21
- data/spec/unit/view_factory_spec.rb +2 -2
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +137 -69
- data/spec/unit/view_helpers/display_name_spec.rb +49 -21
- data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
- data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
- data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +9 -22
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +59 -21
- data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
- data/spec/unit/views/components/attributes_table_spec.rb +94 -52
- data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
- data/spec/unit/views/components/blank_slate_spec.rb +14 -4
- data/spec/unit/views/components/columns_spec.rb +52 -22
- data/spec/unit/views/components/index_list_spec.rb +11 -8
- data/spec/unit/views/components/index_table_for_spec.rb +46 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +68 -59
- data/spec/unit/views/components/panel_spec.rb +32 -21
- data/spec/unit/views/components/popover_spec.rb +7 -7
- data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
- data/spec/unit/views/components/site_title_spec.rb +8 -8
- data/spec/unit/views/components/status_tag_spec.rb +178 -38
- data/spec/unit/views/components/table_for_spec.rb +227 -44
- data/spec/unit/views/components/tabs_spec.rb +39 -0
- data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
- data/spec/unit/views/pages/form_spec.rb +17 -10
- data/spec/unit/views/pages/index_spec.rb +60 -0
- data/spec/unit/views/pages/layout_spec.rb +17 -21
- data/spec/unit/views/pages/show_spec.rb +16 -3
- data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
- data/tasks/docs.rake +1 -1
- data/tasks/parallel_tests.rake +8 -2
- data/tasks/test.rake +8 -4
- data/tasks/yard.rake +7 -5
- metadata +180 -101
- data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
- data/app/assets/images/active_admin/index_list_icons/block_icon.svg +0 -10
- data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
- data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
- data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
- data/app/assets/images/active_admin/loading.gif +0 -0
- data/app/assets/javascripts/active_admin/components/application.js.coffee +0 -23
- data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +0 -26
- data/app/assets/javascripts/active_admin/components/has_many.js.coffee +0 -41
- data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -39
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
- data/app/views/active_admin/dashboard/index.html.arb +0 -1
- data/app/views/active_admin/resource/index.csv.erb +0 -17
- data/docs/3-index-pages/create-an-index.md +0 -29
- data/lib/active_admin/inputs/filter_base.rb +0 -33
- data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
- data/lib/active_admin/inputs/filter_boolean_input.rb +0 -32
- data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -51
- data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
- data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
- data/lib/active_admin/inputs/filter_select_input.rb +0 -61
- data/lib/active_admin/inputs/filter_string_input.rb +0 -24
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
- data/spec/integration/memory_spec.rb +0 -29
- data/spec/integration/stylesheets_spec.rb +0 -41
- data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
- data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
- data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
- data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
- data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
- data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
- data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
- data/spec/javascripts/support/jquery.min.js +0 -4
- data/spec/spec_helper_without_rails.rb +0 -16
- data/tasks/js.rake +0 -32
|
@@ -4,68 +4,69 @@ Active Admin offers the ability to define and use your own authorization
|
|
|
4
4
|
adapter. If implemented, the '#authorized?' will be called when an action is
|
|
5
5
|
taken. By default, '#authorized?' returns true.
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
## Setting up your own AuthorizationAdapter
|
|
9
8
|
|
|
10
9
|
Setting up your own `AuthorizationAdapter` is easy! The following example shows
|
|
11
10
|
how to set up and tie your authorization adapter class to Active Admin:
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
else
|
|
30
|
-
true
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
12
|
+
```ruby
|
|
13
|
+
# app/models/only_authors_authorization.rb
|
|
14
|
+
class OnlyAuthorsAuthorization < ActiveAdmin::AuthorizationAdapter
|
|
15
|
+
|
|
16
|
+
def authorized?(action, subject = nil)
|
|
17
|
+
case subject
|
|
18
|
+
when normalized(Post)
|
|
19
|
+
# Only let the author update and delete posts
|
|
20
|
+
if action == :update || action == :destroy
|
|
21
|
+
subject.author == user
|
|
22
|
+
else
|
|
23
|
+
true
|
|
24
|
+
end
|
|
25
|
+
else
|
|
26
|
+
true
|
|
34
27
|
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
```
|
|
35
32
|
|
|
36
33
|
In order to hook up `OnlyAuthorsAuthorization` to Active Admin, go to your
|
|
37
34
|
application's `config/initializers/active_admin.rb` and add/modify the line:
|
|
38
35
|
|
|
39
|
-
|
|
36
|
+
```ruby
|
|
37
|
+
config.authorization_adapter = "OnlyAuthorsAuthorization"
|
|
38
|
+
```
|
|
40
39
|
|
|
41
40
|
Authorization adapters can be configured per ActiveAdmin namespace as well, for example:
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
42
|
+
```ruby
|
|
43
|
+
ActiveAdmin.setup do |config|
|
|
44
|
+
config.namespace :admin do |ns|
|
|
45
|
+
ns.authorization_adapter = "AdminAuthorization"
|
|
46
|
+
end
|
|
47
|
+
config.namespace :my do |ns|
|
|
48
|
+
ns.authorization_adapter = "DashboardAuthorization"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
```
|
|
51
52
|
|
|
52
53
|
Now, whenever a controller action is performed, the `OnlyAuthorsAuthorization`'s
|
|
53
54
|
`#authorized?` method will be called.
|
|
54
55
|
|
|
55
|
-
|
|
56
56
|
## Getting Access to the Current User
|
|
57
57
|
|
|
58
58
|
From within your authorization adapter, you can call the `#user` method to
|
|
59
59
|
retrieve the current user.
|
|
60
60
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def authorized?(action, subject = nil)
|
|
64
|
-
user.admin?
|
|
65
|
-
end
|
|
61
|
+
```ruby
|
|
62
|
+
class OnlyAdmins < ActiveAdmin::AuthorizationAdapter
|
|
66
63
|
|
|
67
|
-
|
|
64
|
+
def authorized?(action, subject = nil)
|
|
65
|
+
user.admin?
|
|
66
|
+
end
|
|
68
67
|
|
|
68
|
+
end
|
|
69
|
+
```
|
|
69
70
|
|
|
70
71
|
## Scoping Collections in Authorization Adapters
|
|
71
72
|
|
|
@@ -73,42 +74,40 @@ retrieve the current user.
|
|
|
73
74
|
for the adapter to scope the resource's collection. For example, you may want to
|
|
74
75
|
centralize the scoping:
|
|
75
76
|
|
|
76
|
-
|
|
77
|
+
```ruby
|
|
78
|
+
class OnlyMyAccount < ActiveAdmin::AuthorizationAdapter
|
|
77
79
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
80
|
+
def authorized?(action, subject = nil)
|
|
81
|
+
subject.account == user.account
|
|
82
|
+
end
|
|
81
83
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
def scope_collection(collection, action = Auth::READ)
|
|
85
|
+
collection.where(account_id: user.account_id)
|
|
86
|
+
end
|
|
85
87
|
|
|
86
|
-
|
|
88
|
+
end
|
|
89
|
+
```
|
|
87
90
|
|
|
88
91
|
All collections presented on Index Screens will be passed through this method
|
|
89
92
|
and will be scoped accordingly.
|
|
90
93
|
|
|
91
|
-
|
|
92
94
|
## Managing Access to Pages
|
|
93
95
|
|
|
94
96
|
Pages, just like resources, get authorized also. When authorization a page, the
|
|
95
97
|
subject will be an instance of `ActiveAdmin::Page`.
|
|
96
98
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
end
|
|
106
|
-
else
|
|
107
|
-
false
|
|
108
|
-
end
|
|
109
|
-
end
|
|
99
|
+
```ruby
|
|
100
|
+
class OnlyDashboard < ActiveAdmin::AuthorizationAdapter
|
|
101
|
+
def authorized?(action, subject = nil)
|
|
102
|
+
case subject
|
|
103
|
+
when ActiveAdmin::Page
|
|
104
|
+
action == :read && subject.name == "Dashboard" && subject.namespace.name == :admin
|
|
105
|
+
else
|
|
106
|
+
false
|
|
110
107
|
end
|
|
111
|
-
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
```
|
|
112
111
|
|
|
113
112
|
## Action Types
|
|
114
113
|
|
|
@@ -133,61 +132,66 @@ authorized to perform an action on a subject.
|
|
|
133
132
|
|
|
134
133
|
Simply use the `#authorized?(action, subject) method to check.
|
|
135
134
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
index do
|
|
139
|
-
column :title
|
|
140
|
-
column "" do |post|
|
|
141
|
-
if authorized?(:update, post)
|
|
142
|
-
link_to("Edit", admin_post_path(post))
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
end
|
|
135
|
+
```ruby
|
|
136
|
+
ActiveAdmin.register Post do
|
|
147
137
|
|
|
138
|
+
index do
|
|
139
|
+
column :title
|
|
140
|
+
column '' do |post|
|
|
141
|
+
link_to 'Edit', admin_post_path(post) if authorized? :update, post
|
|
148
142
|
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
```
|
|
149
147
|
|
|
150
148
|
If you are implementing a custom controller action, you can use the
|
|
151
149
|
`#authorize!` method to raise an `ActiveAdmin::AccessDenied` exception.
|
|
152
150
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
member_action :publish, :method => :post do
|
|
156
|
-
post = Post.find(params[:id])
|
|
151
|
+
```ruby
|
|
152
|
+
ActiveAdmin.register Post do
|
|
157
153
|
|
|
158
|
-
|
|
159
|
-
|
|
154
|
+
member_action :publish, method: :post do
|
|
155
|
+
post = Post.find(params[:id])
|
|
160
156
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
end
|
|
157
|
+
authorize! :publish, post
|
|
158
|
+
post.publish!
|
|
164
159
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
end
|
|
169
|
-
end
|
|
160
|
+
flash[:notice] = "Post has been published"
|
|
161
|
+
redirect_to [:admin, post]
|
|
162
|
+
end
|
|
170
163
|
|
|
164
|
+
action_item :publish, only: :show do
|
|
165
|
+
if !post.published? && authorized?(:publish, post)
|
|
166
|
+
link_to "Publish", publish_admin_post_path(post), method: :post
|
|
171
167
|
end
|
|
168
|
+
end
|
|
172
169
|
|
|
170
|
+
end
|
|
171
|
+
```
|
|
173
172
|
|
|
174
173
|
## Using the CanCan Adapter
|
|
175
174
|
|
|
176
175
|
Sub-classing `ActiveAdmin::AuthorizationAdapter` is fairly low level. Many times
|
|
177
176
|
it's nicer to have a simpler DSL for managing authorization. Active Admin
|
|
178
|
-
provides an adapter out of the box for [CanCan](https://github.com/ryanb/cancan)
|
|
177
|
+
provides an adapter out of the box for [CanCan](https://github.com/ryanb/cancan)
|
|
178
|
+
and [CanCanCan](https://github.com/CanCanCommunity/cancancan).
|
|
179
179
|
|
|
180
180
|
To use the CanCan adapter, simply update the configuration in the Active Admin
|
|
181
181
|
initializer:
|
|
182
182
|
|
|
183
|
-
|
|
184
|
-
|
|
183
|
+
```ruby
|
|
184
|
+
config.authorization_adapter = ActiveAdmin::CanCanAdapter
|
|
185
|
+
```
|
|
186
|
+
|
|
185
187
|
You can also specify a method to be called on unauthorized access. This is necessary
|
|
186
188
|
in order to prevent a redirect loop that can happen if a user tries to access a page
|
|
187
|
-
they don't have permissions for (see [#2081](https://github.com/
|
|
189
|
+
they don't have permissions for (see [#2081](https://github.com/activeadmin/activeadmin/issues/2081)).
|
|
190
|
+
|
|
188
191
|
```ruby
|
|
189
192
|
config.on_unauthorized_access = :access_denied
|
|
190
|
-
```
|
|
193
|
+
```
|
|
194
|
+
|
|
191
195
|
The method `access_denied` would be defined in `application_controller.rb`. Here is one
|
|
192
196
|
example that redirects the user from the page they don't have permission to
|
|
193
197
|
access to a resource they have permission to access (organizations in this case), and
|
|
@@ -196,9 +200,9 @@ also displays the error message in the browser:
|
|
|
196
200
|
```ruby
|
|
197
201
|
class ApplicationController < ActionController::Base
|
|
198
202
|
protect_from_forgery
|
|
199
|
-
|
|
203
|
+
|
|
200
204
|
def access_denied(exception)
|
|
201
|
-
redirect_to admin_organizations_path, :
|
|
205
|
+
redirect_to admin_organizations_path, alert: exception.message
|
|
202
206
|
end
|
|
203
207
|
end
|
|
204
208
|
```
|
|
@@ -206,22 +210,39 @@ end
|
|
|
206
210
|
By default this will use the ability class named "Ability". This can also be
|
|
207
211
|
changed from the initializer:
|
|
208
212
|
|
|
209
|
-
|
|
213
|
+
```ruby
|
|
214
|
+
config.cancan_ability_class = "MyCustomAbility"
|
|
215
|
+
```
|
|
210
216
|
|
|
211
|
-
Now you can simply use CanCan the way that you would expect and
|
|
212
|
-
will use it for authorization:
|
|
217
|
+
Now you can simply use CanCan or CanCanCan the way that you would expect and
|
|
218
|
+
Active Admin will use it for authorization:
|
|
213
219
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
220
|
+
```ruby
|
|
221
|
+
# app/models/ability.rb
|
|
222
|
+
class Ability
|
|
223
|
+
include CanCan::Ability
|
|
224
|
+
|
|
225
|
+
def initialize(user)
|
|
226
|
+
can :manage, Post
|
|
227
|
+
can :read, User
|
|
228
|
+
can :manage, User, id: user.id
|
|
229
|
+
can :read, ActiveAdmin::Page, name: "Dashboard", namespace_name: :admin
|
|
230
|
+
end
|
|
217
231
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
can :read, User
|
|
221
|
-
can :manage, User, :id => user.id
|
|
222
|
-
can :read, ActiveAdmin::Page, :name => "Dashboard"
|
|
223
|
-
end
|
|
232
|
+
end
|
|
233
|
+
```
|
|
224
234
|
|
|
225
|
-
|
|
235
|
+
To view more details about the API's, visit project pages of [CanCan](https://github.com/ryanb/cancan) and [CanCanCan](https://github.com/CanCanCommunity/cancancan).
|
|
236
|
+
|
|
237
|
+
## Using the Pundit Adapter
|
|
238
|
+
|
|
239
|
+
Active Admin provides an adapter out of the box also for [Pundit](https://github.com/elabs/pundit).
|
|
240
|
+
|
|
241
|
+
To use the Pundit adapter, simply update the configuration in the Active Admin
|
|
242
|
+
initializer:
|
|
243
|
+
|
|
244
|
+
```ruby
|
|
245
|
+
config.authorization_adapter = ActiveAdmin::PunditAdapter
|
|
246
|
+
```
|
|
226
247
|
|
|
227
|
-
|
|
248
|
+
You can simply use Pundit the way that you would expect and Active Admin will use it for authorization. Check Pundit's documentation to [set up Pundit in your application](https://github.com/elabs/pundit#installation). If you want to use batch actions just ensure that `destroy_all?` method is defined in your policy class. You can use this [template policy](https://github.com/activeadmin/activeadmin/blob/master/spec/support/templates/policies/application_policy.rb) in your application instead of default one generated by Pundit's `rails g pundit:install` command.
|
data/docs/14-gotchas.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#Gotchas
|
|
2
|
+
|
|
3
|
+
## Session Commits & Asset Pipeline
|
|
4
|
+
|
|
5
|
+
When configuring the asset pipeline ensure that the asset prefix
|
|
6
|
+
(`config.assets.prefix`) is not the same as the namespace of ActiveAdmin
|
|
7
|
+
(default namespace is `/admin`). If they are the same Sprockets will prevent the
|
|
8
|
+
session from being committed. Flash messages won't work and you will be unable to
|
|
9
|
+
use the session for storing anything.
|
|
10
|
+
|
|
11
|
+
For more information see the following post:
|
|
12
|
+
[http://www.intridea.com/blog/2013/3/20/rails-assets-prefix-may-disable-your-session](http://www.intridea.com/blog/2013/3/20/rails-assets-prefix-may-disable-your-session)
|
|
13
|
+
|
|
14
|
+
## Helpers
|
|
15
|
+
|
|
16
|
+
There are two knowing gotchas with helpers. This hopefully will help you to
|
|
17
|
+
find a solution.
|
|
18
|
+
|
|
19
|
+
### Helpers are not reloading in development
|
|
20
|
+
|
|
21
|
+
This is a known and still open [issue](https://github.com/activeadmin/activeadmin/issues/697)
|
|
22
|
+
the only way is to restart your server each time you change a helper.
|
|
23
|
+
|
|
24
|
+
### Helper maybe not included by default
|
|
25
|
+
|
|
26
|
+
If you use `config.action_controller.include_all_helpers = false` in your application config,
|
|
27
|
+
you need to include it by hand.
|
|
28
|
+
|
|
29
|
+
#### Solutions
|
|
30
|
+
|
|
31
|
+
##### First use a monkey patch
|
|
32
|
+
|
|
33
|
+
This works for all ActiveAdmin resources at once.
|
|
34
|
+
|
|
35
|
+
```ruby
|
|
36
|
+
# config/initializers/active_admin_helpers.rb
|
|
37
|
+
ActiveAdmin::BaseController.class_eval do
|
|
38
|
+
helper ApplicationHelper
|
|
39
|
+
end
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
##### Second use the `controller` method
|
|
43
|
+
|
|
44
|
+
This works only for one resource at a time.
|
|
45
|
+
|
|
46
|
+
```ruby
|
|
47
|
+
ActiveAdmin.register User do
|
|
48
|
+
controller do
|
|
49
|
+
helper UserHelper
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## CSS
|
|
55
|
+
|
|
56
|
+
In order to avoid the override of your application style (with the Active Admin one), you can properly move the generated file `active_admin.css.scss` from `app/assets/stylesheets` to `vendor/assets/stylesheets`
|
|
57
|
+
|
|
58
|
+
## Conflicts
|
|
59
|
+
|
|
60
|
+
### With gems that provides a `search` class method on a model
|
|
61
|
+
|
|
62
|
+
If a gem defines a `search` class method on a model, this can result in conflicts
|
|
63
|
+
with the same method provided by `ransack` (a dependency of ActiveAdmin).
|
|
64
|
+
|
|
65
|
+
Each of this conflicts need to solved is a different way. Some solutions are
|
|
66
|
+
listed below.
|
|
67
|
+
|
|
68
|
+
#### `tire`, `retire` and `elasticsearch-rails`
|
|
69
|
+
|
|
70
|
+
This conflict can be solved, by using explicitly the `search` method of `tire`,
|
|
71
|
+
`retire` or `elasticsearch-rails`:
|
|
72
|
+
|
|
73
|
+
##### For `tire` and `retire`
|
|
74
|
+
|
|
75
|
+
```ruby
|
|
76
|
+
YourModel.tire.search
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
##### For `elasticsearch-rails`
|
|
80
|
+
|
|
81
|
+
```ruby
|
|
82
|
+
YourModel.__elasticsearch__.search
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Sunspot Solr
|
|
86
|
+
|
|
87
|
+
```ruby
|
|
88
|
+
YourModel.solr_search
|
|
89
|
+
```
|
|
90
|
+
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Working with Resources
|
|
2
2
|
|
|
3
|
-
Every Active Admin resource corresponds to a Rails model. So before creating a
|
|
3
|
+
Every Active Admin resource corresponds to a Rails model. So before creating a
|
|
4
4
|
resource you must first create a Rails model for it.
|
|
5
5
|
|
|
6
6
|
## Create a Resource
|
|
7
7
|
|
|
8
|
-
The basic command for creating a resource is `rails g active_admin:resource Post`.
|
|
8
|
+
The basic command for creating a resource is `rails g active_admin:resource Post`.
|
|
9
9
|
The generator will produce an empty `app/admin/post.rb` file like so:
|
|
10
10
|
|
|
11
11
|
```ruby
|
|
@@ -17,15 +17,66 @@ end
|
|
|
17
17
|
## Setting up Strong Parameters
|
|
18
18
|
|
|
19
19
|
Rails 4 replaces `attr_accessible` with [Strong Parameters](https://github.com/rails/strong_parameters),
|
|
20
|
-
which moves attribute whitelisting from the model to the controller.
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
which moves attribute whitelisting from the model to the controller.
|
|
21
|
+
|
|
22
|
+
Use the `permit_params` method to define which attributes may be changed:
|
|
23
|
+
|
|
24
|
+
```ruby
|
|
25
|
+
ActiveAdmin.register Post do
|
|
26
|
+
permit_params :title, :content, :publisher_id
|
|
27
|
+
end
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Any form field that sends multiple values (such as a HABTM association, or an array attribute)
|
|
31
|
+
needs to pass an empty array to `permit_params`:
|
|
32
|
+
|
|
33
|
+
```ruby
|
|
34
|
+
ActiveAdmin.register Post do
|
|
35
|
+
permit_params :title, :content, :publisher_id, roles: []
|
|
36
|
+
end
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Nested associations in the same form also require an array, but it
|
|
40
|
+
needs to be filled with any attributes used.
|
|
41
|
+
|
|
42
|
+
```ruby
|
|
43
|
+
ActiveAdmin.register Post do
|
|
44
|
+
permit_params :title, :content, :publisher_id,
|
|
45
|
+
tags_attributes: [:id, :name, :description, :_destroy]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Note that `accepts_nested_attributes_for` is still required:
|
|
49
|
+
class Post < ActiveRecord::Base
|
|
50
|
+
accepts_nested_attributes_for :tags, allow_destroy: true
|
|
51
|
+
end
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
If you want to dynamically choose which attributes can be set, pass a block:
|
|
55
|
+
|
|
56
|
+
```ruby
|
|
57
|
+
ActiveAdmin.register Post do
|
|
58
|
+
permit_params do
|
|
59
|
+
params = [:title, :content, :publisher_id]
|
|
60
|
+
params.push :author_id if current_user.admin?
|
|
61
|
+
params
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The `permit_params` call creates a method called `permitted_params`. You should use this method when overriding `create` or `update` actions:
|
|
23
67
|
|
|
24
68
|
```ruby
|
|
25
69
|
ActiveAdmin.register Post do
|
|
26
70
|
controller do
|
|
27
|
-
def
|
|
28
|
-
|
|
71
|
+
def create
|
|
72
|
+
# Good
|
|
73
|
+
@post = Post.new(permitted_params[:post])
|
|
74
|
+
# Bad
|
|
75
|
+
@post = Post.new(params[:post])
|
|
76
|
+
|
|
77
|
+
if @post.save
|
|
78
|
+
# ...
|
|
79
|
+
end
|
|
29
80
|
end
|
|
30
81
|
end
|
|
31
82
|
end
|
|
@@ -53,9 +104,6 @@ ActiveAdmin.register Post, as: "Article"
|
|
|
53
104
|
|
|
54
105
|
The resource will then be available at `/admin/articles`.
|
|
55
106
|
|
|
56
|
-
This will also change the key of the resource params passed to the controller.
|
|
57
|
-
In Rails 4, the `permitted_params` key will need to be changed from `:post` to `:article`.
|
|
58
|
-
|
|
59
107
|
## Customize the Namespace
|
|
60
108
|
|
|
61
109
|
We use the `admin` namespace by default, but you can use anything:
|
|
@@ -172,7 +220,7 @@ name? Well, you have to refer to it by its `:id`.
|
|
|
172
220
|
|
|
173
221
|
```ruby
|
|
174
222
|
# config/initializers/active_admin.rb
|
|
175
|
-
config.namespace :admin do |admin
|
|
223
|
+
config.namespace :admin do |admin|
|
|
176
224
|
admin.build_menu do |menu|
|
|
177
225
|
menu.add id: 'blog', label: proc{"Something dynamic"}, priority: 0
|
|
178
226
|
end
|
|
@@ -235,15 +283,25 @@ ActiveAdmin.register Post do
|
|
|
235
283
|
end
|
|
236
284
|
```
|
|
237
285
|
|
|
238
|
-
##
|
|
286
|
+
## Eager loading
|
|
239
287
|
|
|
240
288
|
A common way to increase page performance is to elimate N+1 queries by eager loading associations:
|
|
241
289
|
|
|
290
|
+
```ruby
|
|
291
|
+
ActiveAdmin.register Post do
|
|
292
|
+
includes :author, :categories
|
|
293
|
+
end
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Customizing resource retrieval
|
|
297
|
+
|
|
298
|
+
If you need to customize the collection properties, you can overwrite the `scoped_collection` method.
|
|
299
|
+
|
|
242
300
|
```ruby
|
|
243
301
|
ActiveAdmin.register Post do
|
|
244
302
|
controller do
|
|
245
303
|
def scoped_collection
|
|
246
|
-
|
|
304
|
+
end_of_association_chain.where(visibility: true)
|
|
247
305
|
end
|
|
248
306
|
end
|
|
249
307
|
end
|
|
@@ -255,7 +313,7 @@ If you need to completely replace the record retrieving code (e.g., you have a c
|
|
|
255
313
|
```ruby
|
|
256
314
|
ActiveAdmin.register Post do
|
|
257
315
|
controller do
|
|
258
|
-
def
|
|
316
|
+
def find_resource
|
|
259
317
|
Post.where(id: params[:id]).first!
|
|
260
318
|
end
|
|
261
319
|
end
|
|
@@ -332,9 +390,18 @@ different menus, say perhaps based on user permissions. For example:
|
|
|
332
390
|
|
|
333
391
|
```ruby
|
|
334
392
|
ActiveAdmin.register Ticket do
|
|
335
|
-
belongs_to
|
|
393
|
+
belongs_to :project
|
|
336
394
|
navigation_menu do
|
|
337
395
|
authorized?(:manage, SomeResource) ? :project : :restricted_menu
|
|
338
396
|
end
|
|
339
397
|
end
|
|
340
398
|
```
|
|
399
|
+
|
|
400
|
+
If you still want your `belongs_to` resources to be available in the default menu
|
|
401
|
+
and through non-nested routes, you can use the `:optional` option. For example:
|
|
402
|
+
|
|
403
|
+
```ruby
|
|
404
|
+
ActiveAdmin.register Ticket do
|
|
405
|
+
belongs_to :project, optional: true
|
|
406
|
+
end
|
|
407
|
+
```
|