|
|
|
|
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
|