ActiveadminPolymorphic

Activeadmin Polymorphic gem is made to bring has_many polymorphic nested forms into your ActiveAdmin. ActiveAdmin users formtastic to build awesome forms, but formatstic itself doesn't support polymorphic relations. activeadmin_polymorphic gem is trying to solve that problem.

Features

  • polymorphic forms
  • validation
  • sortable behaviour
  • file uploads

Installation

Add this to your Gemfile:

gem "activeadmin_polymorphic"

and run bundle install.

Include assets in JS and CSS manifests

JS:

#= require activeadmin_polymorphic

CSS:

@import "activeadmin_polymorphic";

Usage

To use the gem, your model should have a related model, which works as a proxy to polymorphic relations.

The gem extends activeadmin's form builder, so to enable the has_many_polymorphic method you need to override form builder using the builder option:

...
SECTIONABLES = [Image, Text]

form builder: ActiveadminPolymorphic::FormBuilder do |f|
  f.polymorphic_has_many :sections, :sectionable, types: SECTIONABLES
end
...

There are few options available:

  • first option, the name of polymorphic has_many association
  • second option, referes to polymorphied version of an association name (sectionable_id and sectaionable_type for example)
  • types - list of related models you want to use
  • allow_destroy - whether or not to allow destroying related objects
  • sortable - enables drag'n'drop for nested forms, accepts sortable column name, for example sortable: :priority

Subforms for polymorphic relations are forms which you define in your ActiveAdmin. The gem fetches and submits them using some ajax magic.

Under the hood

This gem is a set of dirty hacks and tricks. Calling polymorphic_has_many makes it do the following things:

  • for new records it generates a dropdown with polymorphic types
  • for exising records it generates two hidden fields with id and type
  • then the real JavaScript starts, it extracts whole forms from polymorphic models new or edit pages, strips form actions, and inserts those forms right into the parent form
  • when you try to submit forms, JavaScript submits subforms first; if subforms are invalid, it reloads them with errors and interrupts the main form's submission process
  • after all subforms have been successfully saved, it strips them (because forms nested into other forms are semantically invalid, right?) and submits the parent form

File uploads in subforms

The gem relies on rails ajax's form submissions, which doesn't allow to submit files directly. Workaround for this is asynchronous file submission using, for example remotipart for CarrierWave, or refile with refile-input. Note: before subforms submissions JavaScript strips all file inputs from the forms.

Testing

Test's stucture is mostly copied from the original ActiveAdmin.

Install development dependencies with bundle install. To setup the test suit run rake test. Run tests with bundle exec guard. There aren't many of them, let's say there are quite a few.

In plan

  • allow to reuse existing polymorphic objects
  • check who it works with: models under a certain namespace
  • improve tests

License

MIT