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_questions_controller.rb

320 lines
12 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 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_by(answer_position: answer_d_id)
left_answers = poll_answers.where("answer_position > ?",answer_d_id)
left_answers.update_all("answer_position = answer_position - 1") if left_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