module Wizardry

Constants

VERSION

Public Instance Methods

edit() click to toggle source
# File lib/wizardry.rb, line 41
def edit
  Rails.logger.debug("🧙 Running before_edit callback")
  @wizard.current_page.before_edit!(@wizard.object)
end
update() click to toggle source
# File lib/wizardry.rb, line 46
def update
  Rails.logger.debug("🧙 Object valid, saving and moving on")
  @wizard.object.assign_attributes(object_params.merge(last_completed_step_params))

  Rails.logger.debug("🧙 Running before_update callback")
  @wizard.current_page.before_update!(@wizard.object)

  if @wizard.object.valid?(@wizard.current_page.name)
    @wizard.object.transaction do
      @wizard.object.save!
      Rails.logger.debug("🧙 Object saved, trying after_update callback")

      @wizard.current_page.after_update!(@wizard.object)
      Rails.logger.debug("🧙 Object saved and callbacks run, moving on")

      finish if @wizard.complete?
    end

    redirect_to send(@wizard.framework.edit_path_helper, @wizard.next_page.name.to_s.dasherize)
  else
    Rails.logger.debug("🧙 Object not valid, try again")

    render :edit
  end
end
wizard(...) click to toggle source
# File lib/wizardry.rb, line 31
def wizard(...)
  define_method(:wizard) do
    @framework ||= Wizardry::Framework.new(...)
  end
end

Private Instance Methods

check_wizard() click to toggle source
# File lib/wizardry.rb, line 93
def check_wizard
  @wizard.ensure_not_complete unless @wizard.current_page.is_a?(Wizardry::Pages::CompletionPage)
end
clear_identifier!() click to toggle source
# File lib/wizardry.rb, line 131
def clear_identifier!
  Rails.logger.debug("🧙 Clearing cookie")

  cookies.delete(wizard.cookie_name)
end
finalize_object!(finalize_method: :finalize!) click to toggle source
# File lib/wizardry.rb, line 81
def finalize_object!(finalize_method: :finalize!)
  Rails.logger.debug("🧙 Trying to finalize object")

  if @wizard.object.respond_to?(finalize_method)
    Rails.logger.debug("🧙 Object has #{finalize_method} method - calling it")

    @wizard.object.send(finalize_method)
  else
    Rails.logger.warn("🧙 Wizard object has no #{finalize_method} method")
  end
end
finish() click to toggle source
# File lib/wizardry.rb, line 74
def finish
  Rails.logger.debug("🧙 Wizard complete, finishing off")

  finalize_object!
  clear_identifier!
end
identifier() click to toggle source
# File lib/wizardry.rb, line 119
def identifier
  cookies.fetch(wizard.cookie_name) { set_identifier! }
end
last_completed_step_params() click to toggle source
# File lib/wizardry.rb, line 115
def last_completed_step_params
  { last_completed_step: @wizard.current_page.name }
end
object_params() click to toggle source
# File lib/wizardry.rb, line 107
def object_params
  param_key = @wizard.framework.class_name.constantize.model_name.param_key

  params.require(param_key).permit(@wizard.current_page.question_names)
rescue ActionController::ParameterMissing
  { param_key => last_completed_step_params }
end
set_identifier!() click to toggle source
# File lib/wizardry.rb, line 123
def set_identifier!
  identifier = SecureRandom.uuid

  Rails.logger.debug("🧙 Setting cookie #{identifier}")

  cookies[wizard.cookie_name] = identifier
end
setup_wizard() click to toggle source
# File lib/wizardry.rb, line 97
def setup_wizard
  Rails.logger.debug("🧙 Finding or initialising #{wizard.class_name} with '#{identifier}'")

  object = wizard.class_name.constantize.find_or_initialize_by(identifier: identifier)

  Rails.logger.debug("🧙 Initialising the wizard 🪄")

  @wizard = Wizardry::Instance.new(current_page: params[:page].underscore, object: object, framework: @framework)
end