Module: Glib::FormStepper::Controller

Extended by:
ActiveSupport::Concern
Defined in:
app/controllers/concerns/glib/form_stepper/controller.rb

Overview

A session-backed multi-step wizard: per-step answers accumulate in the session and nothing is persisted until the final step commits. Fits pre-account flows and any wizard where an abandoned run should simply disappear.

The including controller declares the flow and its session bucket:

class ApplyController < ApplicationController
include Glib::FormStepper::Controller

STEPS = [
  Glib::FormStepper::Step.new(key: :program, title: "Program", position: 1),
  Glib::FormStepper::Step.new(key: :auditor, title: "Auditor", position: 2)
].freeze
SESSION_KEY = "apply_application".freeze
end

The current step is resolved from params[:id], defaulting to the first step.

Instance Method Summary collapse

Instance Method Details

#clear_session_dataObject



62
63
64
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 62

def clear_session_data
  session.delete(self.class::SESSION_KEY)
end

#current_stepObject



32
33
34
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 32

def current_step
  @current_step ||= find_step(params[:id] || steps.first.key)
end

#next_stepObject



36
37
38
39
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 36

def next_step
  idx = steps.index(current_step)
  idx && steps[idx + 1]
end

#prev_stepObject



41
42
43
44
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 41

def prev_step
  idx = steps.index(current_step)
  idx&.positive? ? steps[idx - 1] : nil
end

#save_step_data(data) ⇒ Object

Merge (not replace) so re-submitting a step updates rather than clobbers.



57
58
59
60
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 57

def save_step_data(data)
  key = current_step.key.to_s
  session_data[key] = (session_data[key] || {}).merge(data)
end

#session_dataObject

Every answer gathered so far, one hash per step key.



47
48
49
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 47

def session_data
  session[self.class::SESSION_KEY] ||= {}
end

#step_dataObject

The current step's answers — what its form reads to prefill itself.



52
53
54
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 52

def step_data
  session_data[current_step.key.to_s] || {}
end

#stepsObject



28
29
30
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 28

def steps
  self.class::STEPS
end