feature_gate

A gem to help manage toggling features on and off in Rails applications without having to re-deploy. Includes a preconfigured page for gate management and an executable for feature gate code cleanup in your codebase after a feature has been deployed.

Installation

Include gem in Gemfile:

gem 'feature_gate'

Copy migration file to app:

rake feature_gate:install:migrations

Migrate to create the table in your DB:

rake db:migrate

Add to config/routes.rb

mount FeatureGate::Engine, at: '/feature_gate'

Optional Configurations

Add config/initializers/feature_gate.rb

FeatureGate.setup do |config|
  config.time_to_stale = 2.weeks # time until a gate is listed as stale, default is 1 month.
end

Usage

Gating features

All gates are closed by default, meaning the features you gate will be hidden until you toggle the gates open.

To gate a part of a page (add # gate-name after end to allow the cleaner executable to remove this line when cleaning the gate out of the files):

<% FeatureGate::Manager.gate('gate-name') do %>
  <h1>This is my gated content</h1>
  <p>I am not seen if the gate is on</p>
<% end # gate-name %>

To gate an entire page:

def index
  FeatureGate::Manager.gate_page('gate-name') # 404s if gate is closed
end

Managing gates

Go to /feature_gate for a preconfigured page to manage your gates. It lists all your gates and gives you the ability to toggle them open or closed. Additionally, it lists all your "stale" gates - gates that have not been touched in 1 month (timeframe is configurable, see under Optional Configurations) and allows you to delete them from your database if it is no longer used in your codebase (this check is done automatically when you try to delete a gate).

To limit accessibility to this page, define feature_gate_control_allowed? in application_controller.rb. If the method is not defined, /feature_gate will be accessible to all users.

def feature_gate_control_allowed?
  # condition for allowing user to toggle feature gates, ex: current_admin_user.present?
end

To remove gates from your codebase after the feature has officially launched use the cleaner executable

$ feature_gate_cleaner gate_name

Console commands

If you prefer to use the console, you can also manage your gates with the following method calls:

To deploy your feature:

FeatureGate::Manager.open!('gate-name')

To gate your feature:

FeatureGate::Manager.close!('gate-name')

To see the names of all opened gates:

FeatureGate::Manager.opened_gates

To see the names of all closed gates:

FeatureGate::Manager.closed_gates

To see the names of all stale gates:

FeatureGate::Manager.stale_gates

To safely delete a gate (only deletes if not used in codebase):

FeatureGate::Manager.destroy!('gate-name')