class PollVotesController < ApplicationController #在开始回答和提交问卷的时候,已经做了判断用户的身份权限 before_action :require_login before_action :get_poll_question before_action :check_answer_in_question,only: [:create] before_action :check_multi_answers def create #每一次答案的点击,请求一次 ActiveRecord::Base.transaction do begin question_votes = @poll_question.poll_votes question_type = @poll_question.question_type question_answer_id = params[:poll_answer_id] ? params[:poll_answer_id] : nil #该答案的id question_answer_text = params[:vote_text].present? ? params[:vote_text] : nil #其他选项的内容 user_votes = question_votes.find_current_vote("user_id",current_user.id) #当前用户的答案,可能有多个 # 当前用户的当前答案,如果已存在,当再次点击的时候,取消答案,即删除该答案 current_vote_text = nil if user_votes.find_vote_text.present? current_vote_text = user_votes.find_vote_text.first end vote_answer_params = { :user_id => current_user.id, :poll_question_id => @poll_question.id, :poll_answer_id => question_answer_id, :vote_text => question_answer_text } #begin if question_type == 1 if user_votes.present? #用户曾经回答过的,答案选择不一样,否则新建 current_user_answer = user_votes.first if current_user_answer.poll_answer_id != question_answer_id #如果说更换了答案,则以前的答案删除,并新建记录 current_user_answer.destroy PollVote.create(vote_answer_params) else if question_answer_text.present? current_user_answer.update_attribute("vote_text", question_answer_text) end end else PollVote.create(vote_answer_params) end elsif question_type == 2 #多选题的话,答案应该是1个以上 question_answer_ids = params[:poll_answer_id] ? params[:poll_answer_id] : [] #该答案的id if question_answer_ids.present? if question_answer_text.present? #有文字输入,但是不存在其他选项的 ques_vote_id = question_answer_ids.map(&:to_i).max if current_vote_text.present? #已有其他输入文字的选项 current_vote_text.update_attribute("vote_text", question_answer_text) else answer_option = { :user_id => current_user.id, :poll_question_id => @poll_question.id, :poll_answer_id => ques_vote_id, :vote_text => question_answer_text } PollVote.create(answer_option) end end ea_ids = user_votes.pluck(:poll_answer_id) common_answer_ids = question_answer_ids & ea_ids #已经存在的试卷选项id new_ids = question_answer_ids - common_answer_ids # 新增的id old_ids = ea_ids - common_answer_ids #没有选择的,则删掉 if new_ids.size > 0 new_ids.each do |e| answer_option = { :user_id => current_user.id, :poll_question_id => @poll_question.id, :poll_answer_id => e, :vote_text => nil } ex_a = PollVote.new(answer_option) ex_a.save! end end if old_ids.size > 0 ea_answer = user_votes.find_current_vote("poll_answer_id",old_ids) ea_answer.destroy_all end else user_votes.destroy_all end else #主观题的输入 if current_vote_text.present? if question_answer_text.present? user_votes.first.update_attribute("vote_text", question_answer_text) else user_votes.destroy_all end else PollVote.create(vote_answer_params) end end @current_question_number = @poll_question.question_number @current_question_necessary = @poll_question.is_necessary #问答记录存在,且有值,才会有返回值。 @current_question_status = 0 if user_votes.present? vote_answer_id = user_votes.pluck(:poll_answer_id).reject(&:blank?).size vote_text_count = user_votes.pluck(:vote_text).reject(&:blank?).size if vote_text_count > 0 || vote_answer_id > 0 @current_question_status = 1 end end rescue Exception => e uid_logger_error(e.message) tip_exception("页面调用失败!") raise ActiveRecord::Rollback end end end private def get_poll_question @poll_question = PollQuestion.find_by_id(params[:poll_question_id]) if @poll_question.blank? normal_status(-1,"问卷试题不存在!") else @poll = @poll_question.poll @course = @poll.course if @poll.blank? normal_status(-1,"问卷不存在!") elsif @course.blank? normal_status(-1,"课堂不存在!") end end end def check_answer_in_question poll_answer_ids = @poll_question.poll_answers.pluck(:id) if @poll_question.question_type == 1 #单选题/多选题 unless (params[:poll_answer_id].present? && poll_answer_ids.include?(params[:poll_answer_id].to_i)) || (params[:poll_answer_id].blank? && params[:vote_text].present?) normal_status(-1, "答案ID错误!") end end end def check_multi_answers if @poll_question.question_type == 2 user_vote_count = params[:poll_answer_id].size if @poll_question.max_choices.present? question_max_choices = @poll_question.max_choices else question_max_choices = 0 end if question_max_choices > 0 && user_vote_count > question_max_choices normal_status(-1,"多选题答案超过最大限制!") end end end end