Newer
Older
dmpopidor / app / controllers / answers_controller.rb
class AnswersController < ApplicationController
  after_action :verify_authorized
  respond_to :html

	# PUT/PATCH /answers/[:id]
  def update
    p_params = permitted_params()
    Answer.transaction do
      @answer = Answer.find_by({plan_id: p_params[:plan_id], question_id: p_params[:question_id]})
      begin
        if @answer.present?
          authorize @answer
          @answer.update(p_params)
          if p_params[:question_option_ids].present?
            @answer.touch() # Saves the record with the updated_at set to the current time. Needed if only answer.question_options is updated
          end
        else
          @answer = Answer.new(p_params)
          @answer.lock_version = 1
          authorize @answer
          # NOTE: save! and destroy! must be used for transactions as they raise errors instead of returning false
          @answer.save!
        end
      rescue ActiveRecord::StaleObjectError
        @stale_answer = @answer
        @answer = Answer.find_by({plan_id: p_params[:plan_id], question_id: p_params[:question_id]})
      end
    end

    @plan = Plan.includes({
      sections: {
        questions: [
          :answers,
          :question_format
        ]
      }
    }).find(p_params[:plan_id])
    @question = @answer.question
    @section = @plan.get_section(@question.section_id)

    respond_to do |format|
      format.js {}
    end
  end # End update

  private
    def permitted_params
      permitted = params.require(:answer).permit(:id, :text, :plan_id, :user_id, :question_id, :lock_version, :question_option_ids => [])
      if !params[:answer][:question_option_ids].nil? && !permitted[:question_option_ids].present? #If question_option_ids has been filtered out because it was a scalar value (e.g. radiobutton answer)
        permitted[:question_option_ids] = [params[:answer][:question_option_ids]] # then convert to an Array
      end
      if !permitted[:id].present?
        permitted.delete(:id)
      end
      return permitted
    end # End permitted_params
end