Module: Subflag::Rails::Helpers

Defined in:
lib/subflag/rails/helpers.rb

Overview

Helpers for using Subflag in controllers and views

All helpers automatically use current_user for targeting if available. Override with user: nil or user: other_user when needed.

Examples:

Controller

class ProjectsController < ApplicationController
  def index
    if subflag_enabled?(:new_dashboard)
      # show new dashboard
    end
    @max_projects = subflag_value(:max_projects, default: 3)
  end
end

View

<% if subflag_enabled?(:new_checkout) %>
  <%= render "new_checkout" %>
<% end %>
<h1><%= subflag_value(:headline, default: "Welcome") %></h1>

Flag accessor for multiple checks

flags = subflag_for
if flags.beta_feature?
  max = flags.max_projects(default: 3)
end

Instance Method Summary collapse

Instance Method Details

#subflag_enabled?(flag_name, user: :auto, context: nil, default: false) ⇒ Boolean

Check if a boolean flag is enabled

Automatically scoped to current_user if available.

Examples:

<% if subflag_enabled?(:new_checkout) %>
<% if subflag_enabled?(:admin_feature, user: nil) %>  <!-- no user context -->

Parameters:

  • flag_name (Symbol, String)

    The flag name (underscores → dashes)

  • user (Object, nil, :auto) (defaults to: :auto)

    User for targeting (default: current_user)

  • context (Hash, nil) (defaults to: nil)

    Additional context attributes

  • default (Boolean) (defaults to: false)

    Default value (optional, defaults to false)

Returns:

  • (Boolean)


47
48
49
50
# File 'lib/subflag/rails/helpers.rb', line 47

def subflag_enabled?(flag_name, user: :auto, context: nil, default: false)
  resolved = resolve_user(user)
  Subflag.flags(user: resolved, context: context).public_send(:"#{flag_name}?", default: default)
end

#subflag_for(user = :auto, context: nil) ⇒ FlagAccessor

Get a flag accessor, optionally for a specific user

Automatically scoped to current_user if no user provided.

Examples:

Using current_user automatically

<% flags = subflag_for %>
<% if flags.beta_feature? %>
  <h1><%= flags.welcome_message(default: "Hello!") %></h1>
<% end %>

Without user context

<% flags = subflag_for(nil) %>

With specific user

<% flags = subflag_for(admin_user) %>

Parameters:

  • user (Object, nil, :auto) (defaults to: :auto)

    User for targeting (default: current_user)

  • context (Hash, nil) (defaults to: nil)

    Additional context attributes

Returns:



91
92
93
94
# File 'lib/subflag/rails/helpers.rb', line 91

def subflag_for(user = :auto, context: nil)
  resolved = resolve_user(user)
  Subflag.flags(user: resolved, context: context)
end

#subflag_prefetch(user = :auto, context: nil) ⇒ Array<Hash>

Prefetch all flags for a user in a single API call

Call this early in a request (e.g., in a before_action) to fetch all flags at once. Subsequent flag lookups will use the cached values.

Automatically scoped to current_user if available.

Examples:

In ApplicationController

class ApplicationController < ActionController::Base
  before_action :prefetch_feature_flags

  private

  def prefetch_feature_flags
    subflag_prefetch  # Uses current_user automatically
  end
end

Without user context

subflag_prefetch(nil)

Parameters:

  • user (Object, nil, :auto) (defaults to: :auto)

    User for targeting (default: current_user)

  • context (Hash, nil) (defaults to: nil)

    Additional context attributes

Returns:

  • (Array<Hash>)

    Array of prefetched flag results (for inspection)



121
122
123
124
# File 'lib/subflag/rails/helpers.rb', line 121

def subflag_prefetch(user = :auto, context: nil)
  resolved = resolve_user(user)
  Subflag.prefetch_flags(user: resolved, context: context)
end

#subflag_value(flag_name, default:, user: :auto, context: nil) ⇒ Object

Get a flag value (default required)

Automatically scoped to current_user if available.

Examples:

<%= subflag_value(:headline, default: "Welcome") %>
<%= subflag_value(:max_items, user: nil, default: 10) %>

Parameters:

  • flag_name (Symbol, String)

    The flag name (underscores → dashes)

  • default (Object)

    Default value (required - determines type)

  • user (Object, nil, :auto) (defaults to: :auto)

    User for targeting (default: current_user)

  • context (Hash, nil) (defaults to: nil)

    Additional context attributes

Returns:

  • (Object)

    The flag value



66
67
68
69
# File 'lib/subflag/rails/helpers.rb', line 66

def subflag_value(flag_name, default:, user: :auto, context: nil)
  resolved = resolve_user(user)
  Subflag.flags(user: resolved, context: context).public_send(flag_name, default: default)
end