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
- #clear_session_data ⇒ Object
- #current_step ⇒ Object
- #next_step ⇒ Object
- #prev_step ⇒ Object
-
#save_step_data(data) ⇒ Object
Merge (not replace) so re-submitting a step updates rather than clobbers.
-
#session_data ⇒ Object
Every answer gathered so far, one hash per step key.
-
#step_data ⇒ Object
The current step's answers — what its form reads to prefill itself.
- #steps ⇒ Object
Instance Method Details
#clear_session_data ⇒ Object
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_step ⇒ Object
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_step ⇒ Object
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_step ⇒ Object
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_data ⇒ Object
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_data ⇒ Object
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 |
#steps ⇒ Object
28 29 30 |
# File 'app/controllers/concerns/glib/form_stepper/controller.rb', line 28 def steps self.class::STEPS end |