Coursemology/coursemology2

View on GitHub
app/controllers/course/assessment/question/text_responses_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true
class Course::Assessment::Question::TextResponsesController < Course::Assessment::Question::Controller
  build_and_authorize_new_question :text_response_question,
                                   class: Course::Assessment::Question::TextResponse, only: [:new, :create]
  load_and_authorize_resource :text_response_question,
                              class: Course::Assessment::Question::TextResponse,
                              through: :assessment, parent: false, except: [:new, :create]
  before_action :load_question_assessment, only: [:edit, :update]

  def new
    if params[:file_upload] == 'true'
      @text_response_question.hide_text = true
    end
    return unless params[:comprehension] == 'true'

    @text_response_question.is_comprehension = true
    @text_response_question.build_at_least_one_group_one_point
  end

  def create
    if @text_response_question.save
      render json: { redirectUrl: course_assessment_path(current_course, @assessment) }
    else
      render json: { errors: @text_response_question.errors }, status: :bad_request
    end
  end

  def edit
    @text_response_question.description = helpers.format_ckeditor_rich_text(@text_response_question.description)
    # The explanation field uses the Summernote editor so it needs sanitization.
    @text_response_question.solutions.each do |sol|
      sol.explanation = helpers.format_ckeditor_rich_text(sol.explanation)
    end
    @text_response_question.build_at_least_one_group_one_point if @text_response_question.comprehension_question?
  end

  def update
    update_skill_ids_if_params_present(text_response_question_params[:question_assessment])

    if update_text_response_question
      render json: { redirectUrl: course_assessment_path(current_course, @assessment) }
    else
      render json: { errors: @text_response_question.errors }, status: :bad_request
    end
  end

  def destroy
    if @text_response_question.destroy
      head :ok
    else
      error = @text_response_question.errors.full_messages.to_sentence
      render json: { errors: error }, status: :bad_request
    end
  end

  private

  def update_text_response_question
    @text_response_question.update(
      text_response_question_params.except(:question_assessment)
    )
  end

  def text_response_question_params
    permitted_params = [
      :title, :description, :staff_only_comments, :maximum_grade, :max_attachments,
      :hide_text, :is_comprehension, :is_attachment_required, :max_attachment_size,
      question_assessment: { skill_ids: [] }
    ]
    if params[:question_text_response][:is_comprehension] == 'true'
      permitted_params.concat(
        [
          groups_attributes:
          [
            :_destroy, :id, :maximum_group_grade,
            points_attributes:
           [
             :_destroy, :id, :point_grade,
             solutions_attributes:
            [
              :_destroy, :id, :solution_type, :information, solution: []
            ]
           ]
          ]
        ]
      )
    else
      permitted_params.concat(
        [solutions_attributes: [:_destroy, :id, :solution_type, :solution, :grade, :explanation]]
      )
    end
    params.require(:question_text_response).permit(*permitted_params)
  end

  def load_question_assessment
    @question_assessment = load_question_assessment_for(@text_response_question)
  end
end