Implementing Feature Flags in Ruby on Rails with Flipper
Learn How to Use Feature Flags in Ruby on Rails for Better Feature Management with Flipper
Please visit Feature Flags if you want to know what a feature flag is and what are the benefits of using a feature flag.
This article will explain how to implement Feature Flags in Ruby on Rails using Flipper gem. It will cover different use cases for feature flags, as well as best practices for managing and testing them.
Setting up flipper
If you don't have a Rails app, you can generate one quickly using rails new my_app
. Now open the Gemfile
and add the following line to the setup:
gem "flipper-cloud"
gem "flipper-active_record"
Run bundle
to install them
bundle install
If you're using the ActiveRecord adapter, you'll also need to generate the migrations and run them.
bin/rails g flipper:active_record
bin/rails db:migrate
This will generate a migration file that includes the required database table so that Flipper can work.
How to use Flipper in your project
After the setup is completed you can now use Flipper as a feature flag for your features. Some of the examples of features we have used Flipper with are:
Sync Invoices To QuickBooks: We used Flipper to enable our Invoice sync with QuickBooks invoices as a beta feature for our certain beta customers. This way other customers who don't want to sync invoices will still use the app.
Multiple Version of Dashboards for A/B testing: Flipper also has a great way to enable certain feature flags to a certain percentage of users.
Feature Flags for Custom Reporting: Some customer wants their reports in a specific format and those reports should be only accessible to them.
Continuous Deployment of new big feature: If your company follows a continuous deployment and DORA metrics, feature flags are very important to do risk-free continuous delivery of your app without breaking them in production. And you can allow your QA team or stakeholders to test them before even your full feature is completed.
These are mostly our use cases but they can differ based on how your team delivers the product to the end users.
Flipper makes it dead simple to enable/disable features for your app, for example:
class InvoiceSyncFeature
def run
return unless Flipper.enabled?(:qb_sync, current_user)
sync_with_quickbooks
end
end
How to enable the Flipper feature flags?
You can enable Flipper feature flags for different actors, most of the rails applications will have user
as an actor.
Here is how you can enable it:
# Enable a feature for everyone
Flipper.enable :qb_sync
# Enable a feature for a specific actor
Flipper.enable_actor :qb_sync, current_user
# Enable a feature for a group of actors
Flipper.enable_group :qb_sync, :admin
# Enable a feature for a percentage of actors
Flipper.enable_percentage_of_actors :qb_sync, 2
Flipper UI
If you want to manage your feature flags from UI you can use:
gem 'flipper-ui'
Install it with bundle install
And mount it into your config/routes.rb
file
YourRailsApp::Application.routes.draw do
mount Flipper::UI.app(Flipper) => '/flipper'
end
Securing your flipper routes
Obviously, we don't want to leave the flipper open for everyone and mess around with it. For that, we are using the Devise gem and we only allow admins to access it. In our case, admins are our site owners.
authenticated do
mount Flipper::UI.app(Flipper) => '/flipper', constraints: lambda { |req|
current_user = req.env['warden'].user
current_user.present? && current_user.admin?
}
end
Or you can use basic HTTP authentication via Rack
# config/routes.rb
flipper_app = Flipper::UI.app do |builder|
builder.use Rack::Auth::Basic do |username, password|
# Verify credentials
end
end
mount flipper_app, at: '/flipper'
Happy Hacking ;)