Feature Flags on Rails

Leonard Garvey
October 30, 2014

During the [previous post] I looked at what feature flags are and why you’d want to use them. In this post I will explore how I’ve implemented them in the current web-application I’m working on. It’s a very simple process which means there are no excuses not to use a feature flag in your application. on rails everything is easier on Rails

The [Rollout] gem

I use the [Rollout] gem as a way of implementing Feature flags. It’s pretty easy to use although there are a few things I don’t like about it. The important things are: 1. It relies on redis which I already have in my stack. 2. It doesn’t have a user-interface so you must enable features with the production console. Here’s how you’d use rollout: ruby if $ :my_cool_feature my_cool_feature end Then you’d be able to activate that feature on the console by typing: ruby $rollout.activate :my_cool_feature

Activating a single user or a group

Often you’ll want to activate a single user or a group of users. To do this we need to modify our feature flag invocation as follows: ruby if $ :my_cool_feature, current_user my_cool_feature end Then you could activate it for a specific user as follows: ruby $rollout.activate_user :my_cool_feature, User.find(1) Alternatively you can define a group of users: ruby # config/initializers/rollout.rb $rollout.define_group(:staff) do |user| user.staff? end Then you can specify a group to activate in the console instead: ruby $rollout.activate_group :my_cool_feature, :staff

Global variables are yucky

Personally I don’t like litering my codebase with $global $variables. Also it’s normally useful that feature flags are always enabled in development and test environments. What I do is wrap Rollout in a very small class: ruby class Feature def*args) (!feature_flags_enabled?) || $*args) rescue true end def self.feature_flags_enabled? Rails.env.production? || Rails.env.staging? end end This lets me use in my code which I believe is more intention-revealing than $ and more aesthetically pleasing.

Ready to Rollout?

rolling out Rollout has other features (like enabling flags based on percentages) and the README has links detailing how to automatically disable features based on errors. The reason I like Rollout is that it’s very simple to get going, and integrates easily into your own stack (assuming you have Redis). There are alternative libraries you can use such as [Flip] which have different features such as ActiveRecord support, or a web-dashboard for enabling/disabling flags. [Rollout]: [Flip]: [previous post]: