Class: Decidim::Forms::QuestionnaireForm

Inherits:
Decidim::Form show all
Includes:
ActiveModel::Validations::Callbacks
Defined in:
decidim-forms/app/forms/decidim/forms/questionnaire_form.rb

Overview

This class holds a Form to response a questionnaire from Decidim’s public page.

Constant Summary

Constants included from AttributeObject::TypeMap

AttributeObject::TypeMap::Boolean, AttributeObject::TypeMap::Decimal

Instance Attribute Summary

Attributes inherited from AttributeObject::Form

#context

Instance Method Summary collapse

Methods inherited from AttributeObject::Form

ensure_hash, from_model, from_params, hash_from, infer_model_name, mimic, mimicked_model_name, model_name, #persisted?, #to_key, #to_model, #to_param, #valid?, #with_context

Methods included from AttributeObject::Model

#[], #[]=, #attributes, #attributes_with_values, #initialize, #to_h

Instance Method Details

#add_responses!(questionnaire:, session_token:, ip_hash:) ⇒ Object



31
32
33
34
35
# File 'decidim-forms/app/forms/decidim/forms/questionnaire_form.rb', line 31

def add_responses!(questionnaire:, session_token:, ip_hash:)
  self.responses = questionnaire.questions.map do |question|
    ResponseForm.from_model(Decidim::Forms::Response.where(question:, user: current_user, session_token:, ip_hash:).first_or_initialize)
  end
end

#before_validationObject

Add other responses to the context so ResponseForm can validate conditional questions



38
39
40
# File 'decidim-forms/app/forms/decidim/forms/questionnaire_form.rb', line 38

def before_validation
  context.responses = attributes[:responses]
end

#map_model(model) ⇒ Object

Private: Create the responses from the questionnaire questions

Returns nothing.



25
26
27
28
29
# File 'decidim-forms/app/forms/decidim/forms/questionnaire_form.rb', line 25

def map_model(model)
  self.responses = model.questions.map do |question|
    ResponseForm.from_model(Decidim::Forms::Response.new(question:))
  end
end

#responses_by_stepObject

Public: Splits responses by step, keeping the separator.

Returns an array of steps. Each step is a list of the questions in that step, including the separator.



46
47
48
49
50
51
52
53
54
55
56
# File 'decidim-forms/app/forms/decidim/forms/questionnaire_form.rb', line 46

def responses_by_step
  @responses_by_step ||=
    begin
      steps = responses.chunk_while do |a, b|
        !a.question.separator? || b.question.separator?
      end.to_a

      steps = [[]] if steps == []
      steps
    end
end

#session_token_in_contextObject



62
63
64
65
66
# File 'decidim-forms/app/forms/decidim/forms/questionnaire_form.rb', line 62

def session_token_in_context
  return if context&.session_token

  errors.add(:tos_agreement, I18n.t("activemodel.errors.models.questionnaire.request_invalid"))
end

#total_stepsObject



58
59
60
# File 'decidim-forms/app/forms/decidim/forms/questionnaire_form.rb', line 58

def total_steps
  responses_by_step.count
end