Hangar is a Rails Engine that exposes your FactoryBot factories with a REST API available in the test environment only


Add Hangar to your application's Gemfile:

gem 'hangar', group: :test


Your application must use FactoryBot to manage its factories. Follow FactoryBot's documentation to add factories to your application.


Protecting tables from deletion

You may have special tables in your test database that should not be cleared by Hangar after a DELETE / request (see below in Usage). In this case, create an initializer in your app as follows:

# config/initializers/hangar.rb

Hangar.do_not_delete = %w(very_important_things valuable_bitcoin_keys spatial_ref_sys) if defined?(Hangar)

Specifying DatabaseCleaner deletion strategy

Not all ORMs support the deletion strategy, such as mongoid. You can override the clean strategy being used by the DELETE /factories request as follows:

# config/initializers/hangar.rb

Hangar.clean_strategy = :truncation

Namespace Routes

In some instances you may want to namespace the routes auto-generated by Hangar.

# config/initializers/hangar.rb

Hangar.route_namespace = :hangar


Hangar will create two factory routes for each factory registered with FactoryBot. These routes mimic FactoryBot's create and attributes_for methods, respectively:

POST /posts
GET /posts/new

Both will respond with a JSON representation of the object.

Hangar also provides a route to clean the database after each test:


This returns 204 No Content when successful.

Overriding Factory Attributes

You may override factory properties on your GET and POST requests using JSON as follows:

{ "post": { "title": "Dolor Sit Amet" } }

Specifying Traits

You may specify factory traits on your GET and POST requests using JSON as follows:

To specify traits POST the JSON as follows:

{ "traits": ["published"] }

Specifying Returned JSON Attributes

Specifying JSON attributes to return is the same as the ActiveModel::Serializer's as_json() include option. In the below examples, comments is a has_many association of our model.

To include associations POST the JSON as follows:

{ "include": "comments" }

To specify which attributes to include on associations, POST the JSON as follows: { "include": { "comments": { "only": "text" } } }

In this case, text is an attribute on our comments model.


You must include the following headers with your requests:

Accept: application/json; charset=utf-8
Content-Type: application/json
Factory: hangar


Hangar is designed to run in the test environment only. A warning will be displayed if it is loaded in any other environment.

For Contributors

Clone the github repository:

git clone https://github.com/faradayio/hangar.git
cd hangar
bundle install

Hangar's test suite runs against the included test application. Start that up with

rake spec

Corporate support

Faraday logo

We use hangar for marketing analytics at Faraday.

Copyright 2014 Andy Rossmeissl