# 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 %>

This is my gated content

I am not seen if the gate is on

<% 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')