class PollQuestionsController < ApplicationController before_action :require_login before_action :get_poll,only:[:new,:create] before_action :get_poll_question,except: [:new,:create] before_action :is_course_teacher before_action :get_poll_questions_count,only:[:create] before_action :get_poll_question_answers,only:[:edit,:update] before_action :check_poll_status,only: [:new,:create,:delete_answer,:destroy] before_action :validates_params,only:[:create,:update] before_action :validates_update_params,only: [:update] def new ActiveRecord::Base.transaction do begin @poll_question = @poll.poll_questions.new rescue Exception => e uid_logger_error(e.message) tip_exception("页面调用失败!") raise ActiveRecord::Rollback end end end # 创建题目和选择的答案 def create ActiveRecord::Base.transaction do begin poll_options = { :question_title => params[:question_title], :question_type => params[:question_type], :is_necessary => params[:is_necessary].to_i, :question_number => @poll_ques_count + 1, :max_choices => params[:max_choices] || nil, :min_choices => params[:min_choices] || nil } @poll_question = @poll.poll_questions.new(poll_options) if params[:insert_id].present? #插入问题时,那么从插入的这个id以后的question_num都将要+1 insert_poll = @poll.poll_questions.find_by(id: params[:insert_id]) if insert_poll.present? #如果该问题存在的话,意思是如果是第一题,那么就不存在插入 ques_num = insert_poll.question_number.to_i @poll_question.question_number = ques_num + 1 #更新了问题的位置 @poll.poll_questions.insert_question(ques_num).update_all("question_number = question_number + 1") end end if @poll_question.save if params[:question_type] != 3 p_answer = params[:question_answers] p_other_answer = params[:question_other_answer] # 新增选择题答案选择的选项 (1..p_answer.count).each do |i| answer = p_answer[i-1] # 传入的答案的内容 question_option = { :answer_position => i, :answer_text => answer } poll_answers = @poll_question.poll_answers.new question_option poll_answers.save end # 新增答案的其他选项 if p_other_answer question_option = { :answer_position => p_answer.count + 1, :answer_text => '' } poll_answers = @poll_question.poll_answers.new question_option poll_answers.save end end end rescue Exception => e uid_logger_error(e.message) tip_exception("问卷的问题创建失败!") raise ActiveRecord::Rollback end end end def show ActiveRecord::Base.transaction do begin @poll_answers = @poll_question.poll_answers rescue Exception => e uid_logger_error(e.message) tip_exception("页面调用失败!") raise ActiveRecord::Rollback end end end def edit ActiveRecord::Base.transaction do begin @poll_answers = @poll_question.poll_answers rescue Exception => e uid_logger_error(e.message) tip_exception("页面调用失败!") raise ActiveRecord::Rollback end end end def update ActiveRecord::Base.transaction do begin if @poll_question.question_type < 3 #当为单选题或多选题时 p_answer = params[:question_answers] p_other_answer = params[:question_other_answer] p_answer_count = p_answer.count @poll_question.poll_answers.each do |an| if (p_answer_count < @poll_current_answers) && (p_answer_count..@poll_current_answers).to_a.include?(an.answer_position) an.destroy end end (1..p_answer_count).each do |i| answer = @poll_question.poll_answers.find_answer_by_custom("answer_position",i).first if answer # 判断该位置的answer是否存在,存在则更新.不存在则跳到下一步 answer.answer_text = p_answer[i-1] answer.answer_position = i answer.save else answer_options = { :answer_position => i, :answer_text => p_answer[i-1] } @poll_question.poll_answers.new answer_options end end if p_other_answer #判断答案的其他选项是否存在 other_answer = @poll_question.poll_answers.find_answer_by_custom("answer_text","").first if other_answer.blank? question_option = { :answer_position => p_answer_count + 1, :answer_text => '' } @poll_question.poll_answers.new question_option else other_answer.answer_position = p_answer_count + 1 other_answer.save end end end @poll_question.update_attributes(poll_questions_params) rescue Exception => e uid_logger_error(e.message) tip_exception("更新失败") raise ActiveRecord::Rollback end end end def delete_answer ActiveRecord::Base.transaction do begin answer_d_id = params[:answer_no].to_i # 答案的当前位置 poll_answers = @poll_question.poll_answers delete_answer = poll_answers.find_answer_by_custom("answer_position",answer_d_id).first left_answer = poll_answers.left_answer_choose("answer_position",answer_d_id) if left_answer.present? left_answer.each do |p| p.answer_position -= 1 p.save end end if delete_answer.destroy normal_status(0, "答案删除成功!") else normal_status(-1, "答案删除失败!") end rescue Exception => e uid_logger_error(e.message) tip_exception("答案删除失败!") end end end def destroy ActiveRecord::Base.transaction do begin question_d_id = @poll_question.question_number.to_i #问题的当前位置 poll_questions = @poll.poll_questions left_questions = poll_questions.insert_question(question_d_id) left_questions.update_all("question_number = question_number - 1") if left_questions @poll_question.destroy! normal_status("删除成功") rescue Exception => e uid_logger_error(e.message) tip_exception("问题删除失败!") end end end def up_down ActiveRecord::Base.transaction do begin opr = params[:opr] current_q_p = @poll_question.question_number.to_i #问题的当前位置 if @poll.polls_status.to_i == 1 if opr.present? if opr.to_s == "up" last_q_p = @poll.poll_questions.find_by(question_number: (current_q_p-1)) #当前问题的前一个问题 if last_q_p.present? @poll_question.update_attribute("question_number", (current_q_p - 1)) last_q_p.update_attribute("question_number", current_q_p) # 重新获取当前问题的位置 normal_status(0, "问题上移成功!") else normal_status(-1, "移动失败,已经是第一个问题了!") end elsif opr.to_s == "down" next_q_p = @poll.poll_questions.find_by(question_number: (current_q_p+1)) #当前问题的后一个问题 if next_q_p.present? @poll_question.update_attribute("question_number", (current_q_p + 1)) next_q_p.update_attribute("question_number", current_q_p) normal_status(0, "问题下移成功!") else normal_status(-1, "移动失败,已经是最后一个问题了!") end end else normal_status(-1, "移动失败,请输入参数") end else normal_status(-1,"已发布的不能移动问题") end rescue Exception => e uid_logger_error(e.message) tip_exception("问题移动失败!") end end end private def poll_questions_params params.require(:poll_question).permit(:question_title,:question_type,:is_necessary,:question_number,:max_choices,:min_choices) end def validates_params normal_status(-1, "问题标题不能为空!") if params[:question_title].blank? normal_status(-1, "是否要求必答的值不能为空!") if params[:is_necessary].blank? normal_status(-1, "问题类型不能为空!") if params[:question_type].blank? if params[:min_choices].present? && params[:max_choices].present? && (params[:min_choices].to_i > params[:max_choices].to_i) normal_status(-1, "最小可选不能大于最大可选!") elsif params[:question_answers].present? && (params[:max_choices].to_i > params[:question_answers].count) normal_status(-1, "选择题的最大可选项不能大于答案数!") elsif [1,3].include?(params[:question_type]) && (params[:max_choices].to_i > 0 || params[:min_choices].to_i > 0) normal_status(-1, "单选题或主观题不能有最大或最小选择数!") elsif params[:question_type] == 3 && (params[:question_answers] || params[:question_other_answer]) normal_status(-1, "主观问题不需要可选答案!") elsif params[:question_type] != 3 if params[:question_answers].present? && params[:question_answers].include?("") normal_status(-1, "选择题不能有空值!") elsif params[:question_other_answer].present? && params[:question_other_answer].length > 0 normal_status(-1, "其他选项不能有值!") elsif params[:question_type] == 1 && params[:question_answers].count < 2 normal_status(-1, "单选题选项不能小于2!") elsif params[:question_type] == 2 && params[:question_answers].count < 3 normal_status(-1, "多选题选项不能小于3!") end end end def validates_update_params question_a_count = params[:question_answers].present? ? params[:question_answers].count : 0 question_o_count = params[:question_other_answer].present? ? params[:question_other_answer].count : 0 normal_status(-1, "已发布的问卷不允许增删答案!") if (((question_a_count+question_o_count) != @poll_current_answers) && (@poll.polls_status.to_i != 1)) end def get_poll @poll = Poll.find_by(id:params[:poll_id]) if @poll.blank? tip_exception(404) end end def get_poll_questions_count if @poll.poll_questions.count > 0 @poll_ques_count = @poll.poll_questions.count else @poll_ques_count = 0 end end def get_poll_question @poll_question = PollQuestion.find_by(id: params[:id]) if @poll_question.present? @poll = Poll.find_by(id:@poll_question.poll_id) else tip_exception(404) end end #获取问题的答案数量 def get_poll_question_answers @poll_current_answers = @poll_question.poll_answers.count end # 已发布的问卷不能新增题目 def check_poll_status normal_status(-1, "问卷已发布,不能更改问卷题目") if @poll.polls_status.to_i != 1 end def is_course_teacher @course = @poll.course if @course.blank? tip_exception(404) else @identity = current_user.course_identity(@course) normal_status(-1, "权限不够") unless(@course.present? && @identity < Course::STUDENT) #课堂存在,且当前用户为教师/管理员 end end end