class CandidateController < ApplicationController before_action :authorize_candidate, except: [:login, :validate, :live_coder] before_action :send_to_oops, only: [:login] def login login_candidate redirect_to :thankyou and return if current_candidate && current_candidate.completed? redirect_to :welcome if current_candidate flash[:error] = "Sorry, incorrect test id" if params[:test_hash].present? end def welcome render :welcome_back if current_candidate.answers.count > 0 end def saved end def oops end def thankyou redirect_to root_path if session[:test_id].nil? reset_session end def question qid = prep_status.current_question_id redirect_to :summary and return if qid.nil? prep_question qid prep_instance_answer @question end def update_answer qid = params[:qid] ||= prep_status.current_question_id @answer = prep_answer qid send "process_#{prep_question(qid).input_type}" end def live_coder prep_question params[:question_id] prep_instance_answer @question prep_answer params[:question_id] render layout: false end def summary @quiz = current_candidate.my_quiz redirect_to :question and return unless prep_status.current_question_id.nil? end def update_summary prep_status 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 @status.can_submit redirect_to :thankyou and return if current_candidate.complete! redirect_to :summary, flash: { error: record_error } end def validate candidate = Candidate.find_by(test_hash: params['test_id']) redirect_to(root_path, flash: { error: "Sorry, incorrect test id" }) and return if candidate.nil? session[:test_id] = candidate.test_hash redirect_to :thankyou and return if candidate.completed? redirect_to :welcome end private def login_candidate candidate = Candidate.find_by(test_hash: params['test_id']) return false if candidate.nil? session[:test_id] = candidate.test_hash end def send_to_oops redirect_to oops_path if current_candidate end 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: [], live_code: [:later, :html, :css, :js] ) 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 if @answer.errors.present? prep_status prep_question answer_params[:question_id] flash[:answer_error] = answer_params[:question_id].to_i render :question else # TODO: change params.key? to submit = save/next/summary redirect_to :summary and return if params.key?(:update) redirect_to :saved and return if params.key?(:save) redirect_to :question end end def process_text @answer.update(answer: answer_params[:text], saved: params.key?(:save), submitted: params.key?(:submit)) route_answer end def process_radio @answer.update(answer: answer_params[:radio], saved: params.key?(:save), submitted: params.key?(:submit)) route_answer end def process_checkbox @answer.update(answer: answer_params[:checkbox], saved: params.key?(:save), submitted: params.key?(:submit)) route_answer end def process_live_code @answer.update(answer: answer_params[:live_code].to_h, saved: params.key?(:save), submitted: params.key?(:submit)) route_answer end end