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

159 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 PollBankQuestionsController < ApplicationController
before_action :require_login, :check_auth #用户需登陆
before_action :get_poll, only:[:create] #获取试卷
before_action :get_poll_question, except: [:create] #获取试卷的问题及试卷
before_action :bank_admin #是否为老师
before_action :validates_params, only: [:create, :update] #传入参数的验证
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.exercise_bank_questions.count + 1,
:max_choices => params[:max_choices] || nil,
:min_choices => params[:min_choices] || nil
}
@poll_question = @poll.exercise_bank_questions.new(poll_options)
if params[:insert_id].present? #插入问题时那么从插入的这个id以后的question_num都将要+1
insert_poll = @poll.exercise_bank_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.exercise_bank_questions.insert_question_ex(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 = {
:choice_position => i,
:choice_text => answer
}
poll_answers = @poll_question.exercise_bank_choices.new question_option
poll_answers.save
end
# 新增答案的其他选项
if p_other_answer
question_option = {
:choice_position => p_answer.count + 1,
:choice_text => ''
}
poll_answers = @poll_question.exercise_bank_choices.new question_option
poll_answers.save
end
end
end
normal_status("创建成功")
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
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_current_answers = @poll_question.exercise_bank_choices.count
@poll_question.exercise_bank_choices.each do |an|
if (p_answer_count < @poll_current_answers) && (p_answer_count..@poll_current_answers).to_a.include?(an.choice_position)
an.destroy
end
end
(1..p_answer_count).each do |i|
answer = @poll_question.exercise_bank_choices.find_choice_custom("choice_position",i).first
if answer # 判断该位置的answer是否存在存在则更新.不存在则跳到下一步
answer.choice_text = p_answer[i-1]
answer.choice_position = i
answer.save
else
answer_options = {
:choice_position => i,
:choice_text => p_answer[i-1]
}
@poll_question.exercise_bank_choices.new answer_options
end
end
if p_other_answer #判断答案的其他选项是否存在
other_answer = @poll_question.exercise_bank_choices.find_choice_custom("choice_text","").first
if other_answer.blank?
question_option = {
:choice_position => p_answer_count + 1,
:choice_text => ''
}
@poll_question.exercise_bank_choices.new question_option
else
other_answer.choice_position = p_answer_count + 1
other_answer.save
end
end
end
@poll_question.update_attributes(poll_questions_params)
normal_status("问卷更新成功")
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
raise ActiveRecord::Rollback
end
end
end
private
def bank_admin
tip_exception(403, "无权限") unless @poll.user_id == current_user.id || current_user.admin_or_business?
end
def get_poll
@poll = ExerciseBank.find_by!(id: params[:exercise_bank_id])
end
def get_poll_question
@poll_question = ExerciseBankQuestion.find_by!(id: params[:id])
@poll = @poll_question.exercise_bank
end
def poll_questions_params
params.permit(:question_title,:question_type,:is_necessary,:question_number,:max_choices,:min_choices)
end
def validates_params
tip_exception(-1, "问题标题不能为空!") if params[:question_title].blank?
tip_exception(-1, "是否要求必答的值不能为空!") if params[:is_necessary].blank?
tip_exception(-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)
tip_exception(-1, "最小可选不能大于最大可选!")
elsif params[:question_answers].present? && (params[:max_choices].to_i > params[:question_answers].count)
tip_exception(-1, "选择题的最大可选项不能大于答案数!")
elsif [1,3].include?(params[:question_type]) && (params[:max_choices].to_i > 0 || params[:min_choices].to_i > 0)
tip_exception(-1, "单选题或主观题不能有最大或最小选择数!")
elsif params[:question_type] == 3 && (params[:question_answers] || params[:question_other_answer])
tip_exception(-1, "主观问题不需要可选答案!")
elsif params[:question_type] != 3
if params[:question_answers].present? && params[:question_answers].include?("")
tip_exception(-1, "选择题不能有空值!")
elsif params[:question_other_answer].present? && params[:question_other_answer].length > 0
tip_exception(-1, "其他选项不能有值!")
elsif params[:question_type] == 1 && params[:question_answers].count < 2
tip_exception(-1, "单选题选项不能小于2")
elsif params[:question_type] == 2 && params[:question_answers].count < 3
tip_exception(-1, "多选题选项不能小于3")
end
end
end
end