You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/app/controllers/poll_votes_controller.rb

167 lines
6.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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? #用户曾经回答过的,答案选择不一样,否则新建
logger.info("########___________user_votes.present1111____________________#######")
current_user_answer = user_votes.first
if current_user_answer&.poll_answer_id != question_answer_id #如果说更换了答案,则以前的答案删除,并新建记录
logger.info("########___________user_votes.present22222____________________#######")
current_user_answer.destroy
PollVote.create(vote_answer_params)
else
logger.info("########___________user_votes.present33333____________________#######")
if question_answer_text.present?
logger.info("########___________user_votes.present4444444____________________#######")
current_user_answer.update_attribute("vote_text", question_answer_text)
end
end
else
logger.info("########___________user_votes.present555555____________________#######")
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