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.
Files changed (467) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +261 -211
  3. data/CONTRIBUTING.md +73 -39
  4. data/Gemfile +38 -20
  5. data/Guardfile +1 -0
  6. data/LICENSE +1 -1
  7. data/README.md +48 -24
  8. data/Rakefile +12 -4
  9. data/activeadmin.gemspec +21 -26
  10. data/app/assets/javascripts/active_admin/application.js.coffee +34 -5
  11. data/app/assets/javascripts/active_admin/base.js.coffee +11 -2
  12. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  13. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  14. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  15. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +3 -4
  16. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +51 -55
  17. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  18. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  19. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
  20. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
  21. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +29 -58
  22. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +2 -3
  23. data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
  24. data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +51 -15
  25. data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
  26. data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
  27. data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
  28. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  29. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
  30. data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
  31. data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -12
  32. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +3 -1
  33. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  34. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  35. data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
  36. data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +0 -0
  37. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
  38. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  39. data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +1 -0
  40. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  41. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  42. data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
  43. data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -0
  44. data/app/assets/stylesheets/active_admin/mixins/{_gradients.css.scss → _gradients.scss} +1 -1
  45. data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
  46. data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
  47. data/app/assets/stylesheets/active_admin/mixins/{_rounded.css.scss → _rounded.scss} +0 -0
  48. data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +7 -1
  49. data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -0
  50. data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
  51. data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
  52. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +10 -7
  53. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  54. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
  55. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +1 -1
  56. data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
  57. data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
  58. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  59. data/app/views/active_admin/devise/sessions/new.html.erb +8 -8
  60. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  61. data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
  62. data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
  63. data/config/locales/ar.yml +120 -0
  64. data/config/locales/bg.yml +26 -6
  65. data/config/locales/bs.yml +122 -0
  66. data/config/locales/ca.yml +10 -1
  67. data/config/locales/cs.yml +7 -2
  68. data/config/locales/da.yml +7 -3
  69. data/config/locales/de-CH.yml +14 -31
  70. data/config/locales/de.yml +33 -33
  71. data/config/locales/el.yml +127 -0
  72. data/config/locales/en-GB.yml +11 -4
  73. data/config/locales/en.yml +21 -4
  74. data/config/locales/{es_MX.yml → es-MX.yml} +14 -24
  75. data/config/locales/es.yml +32 -25
  76. data/config/locales/fa.yml +120 -0
  77. data/config/locales/fi.yml +9 -5
  78. data/config/locales/fr.yml +28 -12
  79. data/config/locales/he.yml +7 -3
  80. data/config/locales/hr.yml +42 -11
  81. data/config/locales/hu.yml +10 -3
  82. data/config/locales/it.yml +31 -3
  83. data/config/locales/ja.yml +17 -4
  84. data/config/locales/ko.yml +7 -1
  85. data/config/locales/lt.yml +42 -11
  86. data/config/locales/lv.yml +7 -3
  87. data/config/locales/{no-NB.yml → nb.yml} +46 -15
  88. data/config/locales/nl.yml +36 -5
  89. data/config/locales/pl.yml +13 -8
  90. data/config/locales/pt-BR.yml +36 -5
  91. data/config/locales/pt-PT.yml +8 -4
  92. data/config/locales/ro.yml +7 -3
  93. data/config/locales/ru.yml +26 -5
  94. data/config/locales/sv-SE.yml +9 -5
  95. data/config/locales/tr.yml +10 -3
  96. data/config/locales/uk.yml +36 -12
  97. data/config/locales/vi.yml +7 -3
  98. data/config/locales/zh-CN.yml +26 -10
  99. data/config/locales/zh-TW.yml +19 -13
  100. data/docs/0-installation.md +14 -6
  101. data/docs/1-general-configuration.md +8 -5
  102. data/docs/10-custom-pages.md +68 -70
  103. data/docs/11-decorators.md +48 -59
  104. data/docs/12-arbre-components.md +79 -73
  105. data/docs/13-authorization-adapter.md +128 -107
  106. data/docs/14-gotchas.md +90 -0
  107. data/docs/2-resource-customization.md +82 -15
  108. data/docs/3-index-pages.md +71 -12
  109. data/docs/3-index-pages/custom-index.md +31 -0
  110. data/docs/3-index-pages/index-as-table.md +45 -2
  111. data/docs/4-csv-format.md +1 -1
  112. data/docs/5-forms.md +78 -29
  113. data/docs/6-show-pages.md +31 -3
  114. data/docs/7-sidebars.md +46 -25
  115. data/docs/8-custom-actions.md +98 -77
  116. data/docs/9-batch-actions.md +211 -133
  117. data/docs/README.md +24 -0
  118. data/features/action_item.feature +3 -3
  119. data/features/authorization_pundit.feature +37 -0
  120. data/features/belongs_to.feature +3 -0
  121. data/features/breadcrumb.feature +48 -0
  122. data/features/comments/commenting.feature +44 -13
  123. data/features/development_reloading.feature +3 -4
  124. data/features/edit_page.feature +9 -19
  125. data/features/favicon.feature +3 -3
  126. data/features/i18n.feature +5 -0
  127. data/features/index/batch_actions.feature +41 -0
  128. data/features/index/filters.feature +23 -0
  129. data/features/index/format_as_csv.feature +90 -4
  130. data/features/index/index_as_blog.feature +4 -4
  131. data/features/index/index_as_table.feature +102 -6
  132. data/features/index/index_blank_slate.feature +22 -0
  133. data/features/index/index_scope_to.feature +16 -16
  134. data/features/index/page_title.feature +11 -0
  135. data/features/index/pagination.feature +1 -1
  136. data/features/index/switch_index_view.feature +14 -14
  137. data/features/new_page.feature +10 -20
  138. data/features/registering_pages.feature +1 -1
  139. data/features/renamed_resource.feature +32 -0
  140. data/features/show/page_title.feature +11 -0
  141. data/features/show/tabs.feature +27 -0
  142. data/features/sidebar_sections.feature +12 -0
  143. data/features/specifying_actions.feature +3 -3
  144. data/features/step_definitions/action_item_steps.rb +2 -2
  145. data/features/step_definitions/action_link_steps.rb +14 -1
  146. data/features/step_definitions/additional_web_steps.rb +17 -18
  147. data/features/step_definitions/asset_steps.rb +3 -3
  148. data/features/step_definitions/attribute_steps.rb +8 -3
  149. data/features/step_definitions/batch_action_steps.rb +26 -9
  150. data/features/step_definitions/blog_steps.rb +3 -0
  151. data/features/step_definitions/breadcrumb_steps.rb +1 -1
  152. data/features/step_definitions/comment_steps.rb +1 -1
  153. data/features/step_definitions/configuration_steps.rb +1 -1
  154. data/features/step_definitions/dashboard_steps.rb +2 -2
  155. data/features/step_definitions/factory_steps.rb +6 -6
  156. data/features/step_definitions/filter_steps.rb +25 -3
  157. data/features/step_definitions/flash_steps.rb +3 -3
  158. data/features/step_definitions/format_steps.rb +17 -10
  159. data/features/step_definitions/index_scope_steps.rb +5 -5
  160. data/features/step_definitions/layout_steps.rb +1 -1
  161. data/features/step_definitions/member_link_steps.rb +2 -2
  162. data/features/step_definitions/menu_steps.rb +3 -3
  163. data/features/step_definitions/pagination_steps.rb +2 -3
  164. data/features/step_definitions/sidebar_steps.rb +8 -3
  165. data/features/step_definitions/site_title_steps.rb +6 -4
  166. data/features/step_definitions/symbol_leak_steps.rb +1 -1
  167. data/features/step_definitions/tab_steps.rb +5 -0
  168. data/features/step_definitions/table_steps.rb +4 -4
  169. data/features/step_definitions/user_steps.rb +15 -9
  170. data/features/step_definitions/web_steps.rb +10 -11
  171. data/features/sti_resource.feature +2 -10
  172. data/features/strong_parameters.feature +73 -0
  173. data/features/support/env.rb +35 -2
  174. data/features/support/paths.rb +2 -2
  175. data/features/support/selectors.rb +1 -1
  176. data/features/users/resetting_password.feature +7 -7
  177. data/lib/active_admin.rb +18 -13
  178. data/lib/active_admin/abstract_view_factory.rb +7 -17
  179. data/lib/active_admin/application.rb +50 -25
  180. data/lib/active_admin/asset_registration.rb +2 -2
  181. data/lib/active_admin/authorization_adapter.rb +2 -2
  182. data/lib/active_admin/base_controller.rb +2 -3
  183. data/lib/active_admin/base_controller/authorization.rb +13 -31
  184. data/lib/active_admin/batch_actions.rb +1 -1
  185. data/lib/active_admin/batch_actions/controller.rb +13 -7
  186. data/lib/active_admin/batch_actions/resource_extension.rb +43 -17
  187. data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
  188. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
  189. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
  190. data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
  191. data/lib/active_admin/callbacks.rb +25 -24
  192. data/lib/active_admin/cancan_adapter.rb +7 -11
  193. data/lib/active_admin/csv_builder.rb +92 -15
  194. data/lib/active_admin/dependency.rb +93 -0
  195. data/lib/active_admin/deprecation.rb +6 -7
  196. data/lib/active_admin/devise.rb +26 -14
  197. data/lib/active_admin/dsl.rb +18 -11
  198. data/lib/active_admin/engine.rb +7 -2
  199. data/lib/active_admin/error.rb +59 -0
  200. data/lib/active_admin/filters/dsl.rb +2 -2
  201. data/lib/active_admin/filters/forms.rb +19 -30
  202. data/lib/active_admin/filters/formtastic_addons.rb +20 -11
  203. data/lib/active_admin/filters/resource_extension.rb +16 -9
  204. data/lib/active_admin/form_builder.rb +94 -105
  205. data/lib/active_admin/helpers/collection.rb +7 -13
  206. data/lib/active_admin/helpers/i18n.rb +7 -0
  207. data/lib/active_admin/helpers/optional_display.rb +5 -5
  208. data/lib/active_admin/helpers/scope_chain.rb +1 -1
  209. data/lib/active_admin/helpers/settings.rb +16 -9
  210. data/lib/active_admin/iconic.rb +17 -15
  211. data/lib/active_admin/iconic/icons.rb +136 -136
  212. data/lib/active_admin/inputs.rb +11 -7
  213. data/lib/active_admin/inputs/datepicker_input.rb +1 -1
  214. data/lib/active_admin/inputs/filters/base.rb +42 -0
  215. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  216. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  217. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  218. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  219. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  220. data/lib/active_admin/inputs/filters/select_input.rb +54 -0
  221. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  222. data/lib/active_admin/menu.rb +3 -3
  223. data/lib/active_admin/menu_collection.rb +1 -4
  224. data/lib/active_admin/namespace.rb +52 -29
  225. data/lib/active_admin/order_clause.rb +26 -0
  226. data/lib/active_admin/orm/active_record.rb +2 -0
  227. data/lib/active_admin/orm/active_record/comments.rb +48 -51
  228. data/lib/active_admin/orm/active_record/comments/comment.rb +16 -10
  229. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -1
  230. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -1
  231. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +15 -13
  232. data/lib/active_admin/page.rb +5 -1
  233. data/lib/active_admin/page_dsl.rb +1 -1
  234. data/lib/active_admin/page_presenter.rb +2 -2
  235. data/lib/active_admin/pundit_adapter.rb +68 -0
  236. data/lib/active_admin/resource.rb +12 -3
  237. data/lib/active_admin/resource/action_items.rb +15 -8
  238. data/lib/active_admin/resource/belongs_to.rb +7 -3
  239. data/lib/active_admin/resource/controllers.rb +1 -0
  240. data/lib/active_admin/resource/includes.rb +12 -0
  241. data/lib/active_admin/resource/menu.rb +5 -5
  242. data/lib/active_admin/resource/naming.rb +25 -47
  243. data/lib/active_admin/resource/page_presenters.rb +1 -1
  244. data/lib/active_admin/resource/routes.rb +26 -10
  245. data/lib/active_admin/resource/scope_to.rb +7 -7
  246. data/lib/active_admin/resource/sidebars.rb +1 -0
  247. data/lib/active_admin/resource_collection.rb +44 -16
  248. data/lib/active_admin/resource_controller.rb +6 -5
  249. data/lib/active_admin/resource_controller/data_access.rb +87 -82
  250. data/lib/active_admin/resource_controller/decorators.rb +91 -9
  251. data/lib/active_admin/resource_controller/streaming.rb +37 -0
  252. data/lib/active_admin/resource_dsl.rb +54 -10
  253. data/lib/active_admin/router.rb +7 -7
  254. data/lib/active_admin/scope.rb +6 -6
  255. data/lib/active_admin/sidebar_section.rb +10 -2
  256. data/lib/active_admin/version.rb +1 -1
  257. data/lib/active_admin/view_factory.rb +17 -16
  258. data/lib/active_admin/view_helpers.rb +0 -1
  259. data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
  260. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +13 -6
  261. data/lib/active_admin/view_helpers/display_helper.rb +30 -17
  262. data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -24
  263. data/lib/active_admin/view_helpers/fields_for.rb +2 -2
  264. data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
  265. data/lib/active_admin/view_helpers/form_helper.rb +5 -9
  266. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
  267. data/lib/active_admin/views/action_items.rb +2 -2
  268. data/lib/active_admin/views/components/action_list_popover.rb +1 -1
  269. data/lib/active_admin/views/components/active_admin_form.rb +123 -0
  270. data/lib/active_admin/views/components/attributes_table.rb +22 -13
  271. data/lib/active_admin/views/components/blank_slate.rb +1 -1
  272. data/lib/active_admin/views/components/columns.rb +13 -7
  273. data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
  274. data/lib/active_admin/views/components/index_list.rb +7 -7
  275. data/lib/active_admin/views/components/paginated_collection.rb +33 -17
  276. data/lib/active_admin/views/components/panel.rb +8 -2
  277. data/lib/active_admin/views/components/popover.rb +1 -1
  278. data/lib/active_admin/views/components/scopes.rb +1 -1
  279. data/lib/active_admin/views/components/sidebar_section.rb +3 -2
  280. data/lib/active_admin/views/components/site_title.rb +2 -2
  281. data/lib/active_admin/views/components/status_tag.rb +34 -11
  282. data/lib/active_admin/views/components/table_for.rb +67 -22
  283. data/lib/active_admin/views/components/tabs.rb +28 -0
  284. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  285. data/lib/active_admin/views/footer.rb +3 -3
  286. data/lib/active_admin/views/header.rb +3 -3
  287. data/lib/active_admin/views/index_as_blog.rb +6 -6
  288. data/lib/active_admin/views/index_as_grid.rb +2 -2
  289. data/lib/active_admin/views/index_as_table.rb +127 -40
  290. data/lib/active_admin/views/pages/base.rb +22 -18
  291. data/lib/active_admin/views/pages/form.rb +16 -6
  292. data/lib/active_admin/views/pages/index.rb +36 -20
  293. data/lib/active_admin/views/pages/layout.rb +1 -1
  294. data/lib/active_admin/views/pages/show.rb +4 -4
  295. data/lib/active_admin/views/tabbed_navigation.rb +7 -3
  296. data/lib/active_admin/views/title_bar.rb +10 -8
  297. data/lib/generators/active_admin/assets/assets_generator.rb +1 -3
  298. data/lib/generators/active_admin/devise/devise_generator.rb +20 -28
  299. data/lib/generators/active_admin/install/install_generator.rb +8 -9
  300. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -22
  301. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -9
  302. data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
  303. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
  304. data/lib/generators/active_admin/page/USAGE +8 -0
  305. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  306. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  307. data/lib/generators/active_admin/resource/resource_generator.rb +2 -4
  308. data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
  309. data/lib/ransack_ext.rb +4 -4
  310. data/script/local +2 -2
  311. data/script/travis_cache +107 -0
  312. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  313. data/spec/javascripts/fixtures/flashes.html +2 -0
  314. data/spec/rails_helper.rb +154 -0
  315. data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
  316. data/spec/{integration → requests}/javascript_spec.rb +5 -5
  317. data/spec/requests/memory_spec.rb +23 -0
  318. data/spec/requests/stylesheets_spec.rb +18 -0
  319. data/spec/spec_helper.rb +12 -170
  320. data/spec/support/detect_rails_version.rb +31 -39
  321. data/spec/support/rails_template.rb +61 -34
  322. data/spec/support/rails_template_with_data.rb +14 -14
  323. data/spec/support/templates/admin/stores.rb +3 -5
  324. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  325. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  326. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  327. data/spec/support/templates/policies/application_policy.rb +45 -0
  328. data/spec/support/templates/policies/category_policy.rb +7 -0
  329. data/spec/support/templates/policies/post_policy.rb +15 -0
  330. data/spec/support/templates/policies/store_policy.rb +11 -0
  331. data/spec/support/templates/policies/user_policy.rb +11 -0
  332. data/spec/support/templates/post_decorator.rb +4 -46
  333. data/spec/unit/abstract_view_factory_spec.rb +11 -11
  334. data/spec/unit/action_builder_spec.rb +24 -18
  335. data/spec/unit/active_admin_spec.rb +2 -2
  336. data/spec/unit/application_spec.rb +30 -31
  337. data/spec/unit/asset_registration_spec.rb +11 -11
  338. data/spec/unit/authorization/authorization_adapter_spec.rb +7 -7
  339. data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
  340. data/spec/unit/authorization/index_overriding_spec.rb +22 -0
  341. data/spec/unit/auto_link_spec.rb +42 -5
  342. data/spec/unit/batch_actions/resource_spec.rb +15 -14
  343. data/spec/unit/batch_actions/settings_spec.rb +18 -18
  344. data/spec/unit/belongs_to_spec.rb +26 -17
  345. data/spec/unit/cancan_adapter_spec.rb +4 -4
  346. data/spec/unit/comments_spec.rb +99 -39
  347. data/spec/unit/component_spec.rb +3 -3
  348. data/spec/unit/config_shared_examples.rb +8 -8
  349. data/spec/unit/controller_filters_spec.rb +26 -14
  350. data/spec/unit/csv_builder_spec.rb +152 -24
  351. data/spec/unit/dependency_spec.rb +135 -0
  352. data/spec/unit/devise_spec.rb +17 -37
  353. data/spec/unit/dsl_spec.rb +70 -9
  354. data/spec/unit/event_spec.rb +9 -9
  355. data/spec/unit/filters/filter_form_builder_spec.rb +167 -157
  356. data/spec/unit/filters/resource_spec.rb +35 -33
  357. data/spec/unit/form_builder_spec.rb +383 -145
  358. data/spec/unit/generators/install_spec.rb +5 -5
  359. data/spec/unit/helpers/collection_spec.rb +18 -18
  360. data/spec/unit/helpers/scope_chain_spec.rb +5 -5
  361. data/spec/unit/helpers/settings_spec.rb +4 -4
  362. data/spec/unit/i18n_spec.rb +12 -0
  363. data/spec/unit/menu_collection_spec.rb +14 -14
  364. data/spec/unit/menu_item_spec.rb +42 -42
  365. data/spec/unit/menu_spec.rb +20 -20
  366. data/spec/unit/namespace/authorization_spec.rb +5 -5
  367. data/spec/unit/namespace/register_page_spec.rb +9 -9
  368. data/spec/unit/namespace/register_resource_spec.rb +26 -28
  369. data/spec/unit/namespace_spec.rb +20 -20
  370. data/spec/unit/order_clause_spec.rb +81 -0
  371. data/spec/unit/page_controller_spec.rb +1 -1
  372. data/spec/unit/page_spec.rb +18 -12
  373. data/spec/unit/pretty_format_spec.rb +42 -14
  374. data/spec/unit/pundit_adapter_spec.rb +98 -0
  375. data/spec/unit/resource/action_items_spec.rb +13 -10
  376. data/spec/unit/resource/includes_spec.rb +21 -0
  377. data/spec/unit/resource/menu_spec.rb +1 -1
  378. data/spec/unit/resource/naming_spec.rb +23 -23
  379. data/spec/unit/resource/page_presenters_spec.rb +8 -8
  380. data/spec/unit/resource/pagination_spec.rb +6 -6
  381. data/spec/unit/resource/routes_spec.rb +10 -10
  382. data/spec/unit/resource/scopes_spec.rb +14 -7
  383. data/spec/unit/resource/sidebars_spec.rb +6 -6
  384. data/spec/unit/resource_collection_spec.rb +66 -68
  385. data/spec/unit/resource_controller/data_access_spec.rb +39 -21
  386. data/spec/unit/resource_controller/decorators_spec.rb +83 -0
  387. data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
  388. data/spec/unit/resource_controller_spec.rb +66 -62
  389. data/spec/unit/resource_registration_spec.rb +12 -12
  390. data/spec/unit/resource_spec.rb +75 -40
  391. data/spec/unit/routing_spec.rb +39 -31
  392. data/spec/unit/scope_spec.rb +112 -30
  393. data/spec/unit/settings_spec.rb +51 -21
  394. data/spec/unit/view_factory_spec.rb +2 -2
  395. data/spec/unit/view_helpers/breadcrumbs_spec.rb +137 -69
  396. data/spec/unit/view_helpers/display_name_spec.rb +49 -21
  397. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
  398. data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
  399. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  400. data/spec/unit/view_helpers/form_helper_spec.rb +9 -22
  401. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +59 -21
  402. data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
  403. data/spec/unit/views/components/attributes_table_spec.rb +94 -52
  404. data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
  405. data/spec/unit/views/components/blank_slate_spec.rb +14 -4
  406. data/spec/unit/views/components/columns_spec.rb +52 -22
  407. data/spec/unit/views/components/index_list_spec.rb +11 -8
  408. data/spec/unit/views/components/index_table_for_spec.rb +46 -0
  409. data/spec/unit/views/components/paginated_collection_spec.rb +68 -59
  410. data/spec/unit/views/components/panel_spec.rb +32 -21
  411. data/spec/unit/views/components/popover_spec.rb +7 -7
  412. data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
  413. data/spec/unit/views/components/site_title_spec.rb +8 -8
  414. data/spec/unit/views/components/status_tag_spec.rb +178 -38
  415. data/spec/unit/views/components/table_for_spec.rb +227 -44
  416. data/spec/unit/views/components/tabs_spec.rb +39 -0
  417. data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
  418. data/spec/unit/views/pages/form_spec.rb +17 -10
  419. data/spec/unit/views/pages/index_spec.rb +60 -0
  420. data/spec/unit/views/pages/layout_spec.rb +17 -21
  421. data/spec/unit/views/pages/show_spec.rb +16 -3
  422. data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
  423. data/tasks/docs.rake +1 -1
  424. data/tasks/parallel_tests.rake +8 -2
  425. data/tasks/test.rake +8 -4
  426. data/tasks/yard.rake +7 -5
  427. metadata +180 -101
  428. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  429. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  430. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  431. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  432. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  433. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +0 -10
  434. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
  435. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
  436. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
  437. data/app/assets/images/active_admin/loading.gif +0 -0
  438. data/app/assets/javascripts/active_admin/components/application.js.coffee +0 -23
  439. data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +0 -26
  440. data/app/assets/javascripts/active_admin/components/has_many.js.coffee +0 -41
  441. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
  442. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -39
  443. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
  444. data/app/views/active_admin/dashboard/index.html.arb +0 -1
  445. data/app/views/active_admin/resource/index.csv.erb +0 -17
  446. data/docs/3-index-pages/create-an-index.md +0 -29
  447. data/lib/active_admin/inputs/filter_base.rb +0 -33
  448. data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
  449. data/lib/active_admin/inputs/filter_boolean_input.rb +0 -32
  450. data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -51
  451. data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
  452. data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
  453. data/lib/active_admin/inputs/filter_select_input.rb +0 -61
  454. data/lib/active_admin/inputs/filter_string_input.rb +0 -24
  455. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
  456. data/spec/integration/memory_spec.rb +0 -29
  457. data/spec/integration/stylesheets_spec.rb +0 -41
  458. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
  459. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
  460. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
  461. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
  462. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
  463. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
  464. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
  465. data/spec/javascripts/support/jquery.min.js +0 -4
  466. data/spec/spec_helper_without_rails.rb +0 -16
  467. 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
- # 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
-
20
- # Only let the author update and delete posts
21
- if action == :update || action == :destroy
22
- subject.author == user
23
-
24
- # If it's not an update or destroy, anyone can view it
25
- else
26
- true
27
- end
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
- config.authorization_adapter = "OnlyAuthorsAuthorization"
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
- 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
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
- class OnlyAdmins < ActiveAdmin::AuthorizationAdapter
62
-
63
- def authorized?(action, subject = nil)
64
- user.admin?
65
- end
61
+ ```ruby
62
+ class OnlyAdmins < ActiveAdmin::AuthorizationAdapter
66
63
 
67
- end
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
- class OnlyMyAccount < ActiveAdmin::AuthorizationAdapter
77
+ ```ruby
78
+ class OnlyMyAccount < ActiveAdmin::AuthorizationAdapter
77
79
 
78
- def authorized?(action, subject = nil)
79
- subject.account == user.account
80
- end
80
+ def authorized?(action, subject = nil)
81
+ subject.account == user.account
82
+ end
81
83
 
82
- def scope_collection(collection)
83
- collection.where(:account_id => user.account_id)
84
- end
84
+ def scope_collection(collection, action = Auth::READ)
85
+ collection.where(account_id: user.account_id)
86
+ end
85
87
 
86
- end
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
- class OnlyDashboard < ActiveAdmin::AuthorizationAdapter
98
- def authorized?(action, subject = nil)
99
- case subject
100
- when ActiveAdmin::Page
101
- if action == :read && subject.name == "Dashboard"
102
- true
103
- else
104
- false
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
- ActiveAdmin.register Post do
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
- ActiveAdmin.register Post do
154
-
155
- member_action :publish, :method => :post do
156
- post = Post.find(params[:id])
151
+ ```ruby
152
+ ActiveAdmin.register Post do
157
153
 
158
- authorize! :publish, post
159
- post.publish!
154
+ member_action :publish, method: :post do
155
+ post = Post.find(params[:id])
160
156
 
161
- flash[:notice] = "Post has been published"
162
- redirect_to [:admin, post]
163
- end
157
+ authorize! :publish, post
158
+ post.publish!
164
159
 
165
- action_item :only => :show do
166
- if !post.published? && authorized?(:publish, post)
167
- link_to("Publish", publish_admin_post_path(post), :method => :post)
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
- config.authorization_adapter = ActiveAdmin::CanCanAdapter
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/gregbell/active_admin/issues/2081)).
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, :alert => exception.message
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
- config.cancan_ability_class = "MyCustomAbility"
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 Active Admin
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
- # app/models/ability.rb
215
- class Ability
216
- include CanCan::Ability
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
- def initialize(user)
219
- can :manage, Post
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
- end
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
- To view more details about the CanCan API, visit [https://github.com/ryanb/cancan](https://github.com/ryanb/cancan).
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.
@@ -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. There are
21
- talks ([#2594](https://github.com/gregbell/active_admin/issues/2594)) on providing a
22
- cleaner DSL, but for now you do so like this:
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 permitted_params
28
- params.permit post: [:title, :content, :author]
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
- ## Customizing resource retrieval
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
- super.includes :author, :categories
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 resource
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: :project
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
+ ```