class QuizController < ApplicationController before_action :authorize_candidate def question qid = prep_status.current_question_id || params[:question_id] redirect_to :summary and return if qid.nil? prep_question qid @answer = prep_answer qid prep_instance_answer @question end def update_answer @answer = prep_answer answer_params[:question_id] prep_status send "process_#{prep_question(answer_params[:question_id]).input_type}" route_answer_xhr and return if request.xhr? route_answer_html end def summary @quiz = current_candidate.my_quiz redirect_to :question and return unless prep_status.current_question_id.nil? end def submit_summary not_completed_error = 'You must complete all questions to submit your test.' record_error = 'There was a problem with your submission. Please try again later.' redirect_to :summary, flash: { error: not_completed_error } and return unless prep_status.can_submit redirect_to :thankyou and return if current_candidate.complete! redirect_to :summary, flash: { error: record_error } end private def prep_question qid @question = current_candidate.fetch_question(qid) end def prep_status @status ||= QuizStatus.new(current_candidate) end def prep_instance_answer question @answer = question.answer.nil? ? Answer.new : Answer.find(question.answer_id) end def answer_params params.require(:answer).permit( :question_id, :answer_id, :radio, :text, checkbox: [], with_other: [:other, options: []], live_code: [:later, :html, :css, :js, :text] ) end def prep_answer qid = answer_params[:question_id] answer_ids = { question_id: qid, candidate_id: current_candidate.to_i } answer = Answer.find_or_create_by(answer_ids) answer end def route_answer_html if @answer.errors.present? prep_question answer_params[:question_id] flash[:error] = answer_params[:question_id].to_i render :question else # TODO: change params.key? to submit = save/next/summary redirect_to :saved and return if params.key?(:save) redirect_to :question end end def route_answer_xhr if @answer.errors.present? render json: @answer.errors["answer"].to_json, status: 400 else results = { message: "Your answer has been updated successfully!", can_submit: prep_status.can_submit, progress: prep_status.progress } render json: results.to_json end end # TODO: maybe a better way to do this. See Admin/QuestionController#process_question_params def process_text @answer.update(answer: answer_params[:text], saved: params.key?(:save), submitted: params.key?(:submit)) end def process_radio @answer.update(answer: answer_params[:radio], saved: params.key?(:save), submitted: params.key?(:submit)) end def process_checkbox @answer.update(answer: answer_params[:checkbox], saved: params.key?(:save), submitted: params.key?(:submit)) end def process_live_code @answer.update(answer: answer_params[:live_code].to_h, saved: params.key?(:save), submitted: params.key?(:submit)) end def process_radio_other @answer.update(answer: answer_params[:with_other].to_h, saved: params.key?(:save), submitted: params.key?(:submit)) end alias process_checkbox_other process_radio_other end