You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

exercise_controller.rb 44 kB

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
10 years ago
​
10 years ago
​
​
​
10 years ago
10 years ago
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020
  1. class ExerciseController < ApplicationController
  2. layout "base_courses"
  3. before_filter :find_exercise_and_course, :only => [:create_exercise_question, :edit, :update, :show, :destroy,
  4. :commit_exercise, :commit_answer,:publish_exercise,:republish_exercise,
  5. :show_student_result,:student_exercise_list, :update_question_num,
  6. :send_to_course, :get_student_uncomplete_question, :edit_question_score]
  7. before_filter :find_course, :only => [:index,:new,:create]
  8. include ExerciseHelper
  9. def index
  10. publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
  11. publish_exercises.each do |exercise|
  12. exercise.update_column('exercise_status', 2)
  13. course = exercise.course
  14. course.members.each do |m|
  15. exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
  16. end
  17. end
  18. if @course.is_public == 0 && !(User.current.member_of_course?(@course)||User.current.admin?)
  19. render_403
  20. return
  21. end
  22. remove_invalid_exercise(@course)
  23. @is_teacher = User.current.allowed_to?(:as_teacher,@course)
  24. if @is_teacher || User.current.admin?
  25. exercises = @course.exercises.order("created_at asc")
  26. else
  27. exercises = @course.exercises.where("exercise_status <> 1").order("created_at asc")
  28. end
  29. @exercises = paginateHelper exercises,20 #分页
  30. @left_nav_type = 8
  31. respond_to do |format|
  32. format.html
  33. end
  34. end
  35. def show
  36. publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
  37. publish_exercises.each do |exercise|
  38. exercise.update_column('exercise_status', 2)
  39. course = exercise.course
  40. course.members.each do |m|
  41. exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
  42. end
  43. end
  44. unless User.current.member_of_course?(@course) || User.current.admin?
  45. render_403
  46. return
  47. end
  48. @exercise = Exercise.find params[:id]
  49. @exercise.course_messages.each do |message|
  50. if User.current.id == message.user_id && message.viewed == 0
  51. message.update_attributes(:viewed => true) if message.viewed == 0
  52. end
  53. end
  54. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  55. exercise_end = @exercise.end_time.nil? ? false : @exercise.end_time > Time.now
  56. if @exercise.time == -1
  57. @can_edit_excercise = exercise_end
  58. else
  59. @can_edit_excercise = !has_commit_exercise?(@exercise.id,User.current.id)&& exercise_end
  60. end
  61. unless @is_teacher
  62. @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first
  63. if @exercise_user.nil?
  64. eu = ExerciseUser.create(:user_id => User.current.id, :exercise_id => @exercise.id, :start_at => Time.now, :status => false)
  65. @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first
  66. end
  67. #score = calculate_student_score(@exercise, User.current)
  68. #@exercise_user.update_attributes(:objective_score => score, :score => (score + (@exercise_user.subjective_score > 0 ? @exercise_user.subjective_score : 0)))
  69. end
  70. # @percent = get_percent(@exercise,User.current)
  71. @exercise_questions = @exercise.exercise_questions
  72. @left_nav_type = 8
  73. respond_to do |format|
  74. format.html {render :layout => 'base_courses'}
  75. end
  76. #end
  77. end
  78. def new
  79. option = {
  80. :exercise_name => "",
  81. :course_id => @course.id,
  82. :exercise_status => 1,
  83. :user_id => User.current.id,
  84. :time => "",
  85. :end_time => "",
  86. :publish_time => "",
  87. :exercise_description => "",
  88. :show_result => 1
  89. }
  90. @exercise = Exercise.create option
  91. if @exercise
  92. redirect_to edit_exercise_url @exercise.id
  93. end
  94. end
  95. def create
  96. if params[:exercise]
  97. exercise = Exercise.find(params[:exercise_id]) if params[:exercise_id]
  98. exercise ||= Exercise.new
  99. exercise.exercise_name = params[:exercise][:exercise_name]
  100. exercise.exercise_description = params[:exercise][:exercise_description]
  101. exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1)
  102. exercise.publish_time = params[:exercise][:publish_time]
  103. exercise.user_id = User.current.id
  104. exercise.time = params[:exercise][:time]
  105. exercise.course_id = params[:course_id]
  106. exercise.exercise_status = 1
  107. if exercise.save
  108. @exercise = exercise
  109. respond_to do |format|
  110. format.js
  111. end
  112. end
  113. end
  114. end
  115. def edit
  116. @left_nav_type = 8
  117. respond_to do |format|
  118. format.html{render :layout => 'base_courses'}
  119. end
  120. end
  121. def update
  122. @exercise.exercise_name = params[:exercise][:exercise_name]
  123. @exercise.exercise_description = params[:exercise][:exercise_description]
  124. @exercise.time = params[:exercise][:time].blank? ? -1 : params[:exercise][:time]
  125. @exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1)
  126. @exercise.publish_time = params[:exercise][:publish_time]
  127. @exercise.show_result = params[:show_result] ? 1 : 0
  128. @exercise.question_random = params[:question_random] ? 0 : 1
  129. @exercise.choice_random = params[:choice_random] ? 0 : 1
  130. if @exercise.save
  131. respond_to do |format|
  132. format.js
  133. end
  134. else
  135. render_404
  136. end
  137. end
  138. def destroy
  139. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  140. if @exercise && @exercise.destroy
  141. if @is_teacher
  142. exercises = Exercise.where("course_id =?", @course.id)
  143. else
  144. exercises = Exercise.where("course_id =? and exercise_status =?", @course.id, 2)
  145. end
  146. @exercises = paginateHelper exercises,20 #分页
  147. respond_to do |format|
  148. format.js
  149. end
  150. end
  151. end
  152. # 统计结果
  153. def statistics_result
  154. @exercise = Exercise.find(params[:id])
  155. exercise_questions = @exercise.exercise_questions
  156. @exercise_questions = paginateHelper exercise_questions, 5
  157. @left_nav_type = 8
  158. respond_to do |format|
  159. format.html{render :layout => 'base_courses'}
  160. end
  161. end
  162. # 添加题目
  163. # question_type 1:单选 2:多选 3:填空题
  164. def create_exercise_question
  165. question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title]
  166. option = {
  167. :question_title => question_title,
  168. :question_type => params[:question_type] || 1,
  169. :question_number => params[:question_type] == "1"? @exercise.exercise_questions.where("question_type = 1").count + 1 :
  170. (params[:question_type] == "2" ? (@exercise.exercise_questions.where("question_type = 2").count + 1) :
  171. (params[:question_type] == "3" ? (@exercise.exercise_questions.where("question_type = 3").count + 1) :
  172. @exercise.exercise_questions.where("question_type = 4").count + 1)),
  173. :question_score => params[:question_score]
  174. }
  175. @exercise_questions = @exercise.exercise_questions.new option
  176. # params[:question_answer] 题目选项
  177. if params[:question_answer]
  178. for i in 1..params[:question_answer].count
  179. answer = (params[:question_answer].values[i-1].nil? || params[:question_answer].values[i-1].empty?) ? l(:label_new_answer) : params[:question_answer].values[i-1]
  180. question_option = {
  181. :choice_position => i,
  182. :choice_text => answer
  183. }
  184. @exercise_questions.exercise_choices.new question_option
  185. end
  186. end
  187. # 如果是插入的话,那么从插入的这个id以后的question_num都将要+1
  188. if params[:quest_id]
  189. @is_insert = true
  190. if @exercise_questions.question_type == 1
  191. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 1).update_all(" question_number = question_number + 1")
  192. #@exercise.exercise_questions.where("question_number > #{params[:quest_num].to_i} and question_type == 1").update_all(" question_number = question_number + 1")
  193. elsif @exercise_questions.question_type == 2
  194. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 2).update_all(" question_number = question_number + 1")
  195. elsif @exercise_questions.question_type == 3
  196. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number + 1")
  197. else
  198. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 4).update_all(" question_number = question_number + 1")
  199. end
  200. # @exercise_question_num = params[:quest_num].to_i
  201. @exercise_questions.question_number = params[:quest_num].to_i + 1
  202. end
  203. if @exercise_questions.save
  204. # params[:exercise_choice] 标准答案参数
  205. # 问答题标准答案有三个,单独处理
  206. if @exercise_questions.question_type == 3
  207. for i in 1..params[:exercise_choice].count
  208. standart_answer = ExerciseStandardAnswer.new
  209. standart_answer.exercise_question_id = @exercise_questions.id
  210. standart_answer.answer_text = params[:exercise_choice].values[i-1]
  211. standart_answer.save
  212. end
  213. elsif @exercise_questions.question_type == 4
  214. unless params[:exercise_choice] == ""
  215. standart_answer = ExerciseStandardAnswer.new
  216. standart_answer.exercise_question_id = @exercise_questions.id
  217. standart_answer.answer_text = params[:exercise_choice]
  218. standart_answer.save
  219. end
  220. else
  221. standart_answer = ExerciseStandardAnswer.new
  222. standart_answer.exercise_question_id = @exercise_questions.id
  223. if @exercise_questions.question_type == 1
  224. standart_answer.exercise_choice_id = sigle_selection_standard_answer(params[:exercise_choice])
  225. elsif @exercise_questions.question_type == 2
  226. standart_answer.exercise_choice_id = multiselect_standard_answer(params[:exercise_choice])
  227. end
  228. standart_answer.save
  229. end
  230. respond_to do |format|
  231. format.js
  232. end
  233. end
  234. end
  235. # 修改题目
  236. # params[:exercise_question] The id of exercise_question
  237. # params[:question_answer] eg:A、B、C选项
  238. def update_exercise_question
  239. @exercise_question = ExerciseQuestion.find params[:exercise_question]
  240. @exercise_question.question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title]
  241. @exercise_question.question_score = params[:question_score]
  242. # 处理选项:如果选了某个选项,那么则要删除之前的选项
  243. if params[:question_answer]
  244. @exercise_question.exercise_choices.each do |answer|
  245. answer.destroy unless params[:question_answer].keys.include? answer.id.to_s
  246. end
  247. for i in 1..params[:question_answer].count
  248. question = @exercise_question.exercise_choices.find_by_id params[:question_answer].keys[i-1]
  249. answer = (params[:question_answer].values[i-1].nil? || params[:question_answer].values[i-1].empty?) ? l(:label_new_answer) : params[:question_answer].values[i-1]
  250. if question
  251. question.choice_position = i
  252. question.choice_text = answer
  253. question.save
  254. else
  255. question_option = {
  256. :choice_position => i,
  257. :choice_text => answer
  258. }
  259. @exercise_question.exercise_choices.new question_option
  260. end
  261. end
  262. end
  263. # 更新标准答案
  264. if params[:exercise_choice]
  265. if @exercise_question.question_type == 3
  266. # 删除不合理的选项
  267. @exercise_question.exercise_standard_answers.each do |answer|
  268. answer.destroy unless params[:exercise_choice].keys.include? answer.id.to_s
  269. end
  270. for i in 1..params[:exercise_choice].count
  271. # 找到对应的标准答案
  272. question_standart = @exercise_question.exercise_standard_answers.find_by_id params[:exercise_choice].keys[i-1]
  273. # 标准答案值
  274. answer_standart = (params[:exercise_choice].values[i-1].nil? || params[:exercise_choice].values[i-1].empty?) ? l(:label_new_answer) : params[:exercise_choice].values[i-1]
  275. if question_standart
  276. question_standart.answer_text = answer_standart
  277. question_standart.save
  278. else
  279. standart_answer_option = {
  280. :answer_text => answer_standart
  281. }
  282. @exercise_question.exercise_standard_answers.new standart_answer_option
  283. end
  284. end
  285. elsif @exercise_question.question_type == 4
  286. answer_standart = @exercise_question.exercise_standard_answers.empty? ? nil : @exercise_question.exercise_standard_answers.first
  287. if params[:exercise_choice] == "" && !answer_standart.nil?
  288. answer_standart.destroy
  289. elsif params[:exercise_choice] != "" && !answer_standart.nil?
  290. answer_standart.answer_text = params[:exercise_choice]
  291. answer_standart.save
  292. elsif params[:exercise_choice] != "" && answer_standart.nil?
  293. standart_answer_option = {
  294. :answer_text => params[:exercise_choice]
  295. }
  296. @exercise_question.exercise_standard_answers.new standart_answer_option
  297. end
  298. else
  299. answer_standart = @exercise_question.exercise_standard_answers.first
  300. answer_standart.exercise_choice_id = @exercise_question.question_type == 1 ? sigle_selection_standard_answer(params[:exercise_choice]) : multiselect_standard_answer(params[:exercise_choice])
  301. answer_standart.save
  302. end
  303. @exercise_question.save
  304. @exercise = @exercise_question.exercise
  305. respond_to do |format|
  306. format.js
  307. end
  308. end
  309. end
  310. # 删除题目
  311. def delete_exercise_question
  312. @exercise_question = ExerciseQuestion.find params[:exercise_question]
  313. @exercise = @exercise_question.exercise
  314. if @exercise_question.question_type == 1
  315. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 1).update_all(" question_number = question_number - 1")
  316. #@exercise.exercise_questions.where("question_number > #{params[:quest_num].to_i} and question_type == 1").update_all(" question_number = question_number + 1")
  317. elsif @exercise_question.question_type == 2
  318. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 2).update_all(" question_number = question_number - 1")
  319. elsif @exercise_question.question_type == 3
  320. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number - 1")
  321. else
  322. ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 4).update_all(" question_number = question_number - 1")
  323. end
  324. # @exercise_question_num = params[:quest_num].to_i
  325. # @exercise_questions.question_number = params[:quest_num].to_i - 1
  326. #
  327. # exercise_questions = @exercise.exercise_questions.where("question_number > #{@exercise_question.question_number}")
  328. # exercise_questions.each do |question|
  329. # question.question_number -= 1
  330. # question.save
  331. # end
  332. if @exercise_question && @exercise_question.destroy
  333. respond_to do |format|
  334. format.js
  335. end
  336. end
  337. end
  338. #题目上移/下移
  339. def update_question_num
  340. @exercise_question = ExerciseQuestion.find params[:ques_id]
  341. exercise_questions = @exercise.exercise_questions
  342. if @exercise_question
  343. if params[:opr] == 'up' && @exercise_question.question_number > 1
  344. @before_que = exercise_questions.where("question_type = #{@exercise_question.question_type} and question_number = #{@exercise_question.question_number - 1}").first
  345. if @before_que && @exercise_question.update_attribute('question_number', @exercise_question.question_number - 1)
  346. @before_que.update_attribute('question_number', @before_que.question_number + 1)
  347. end
  348. elsif params[:opr] == 'down' && @exercise_question.question_number < exercise_questions.count
  349. @after_que = exercise_questions.where("question_type = #{@exercise_question.question_type} and question_number = #{@exercise_question.question_number + 1}").first
  350. if @after_que && @exercise_question.update_attribute('question_number', @exercise_question.question_number + 1)
  351. @after_que.update_attribute('question_number', @after_que.question_number - 1)
  352. end
  353. end
  354. respond_to do |format|
  355. format.js
  356. end
  357. end
  358. end
  359. # 发送试卷
  360. def send_to_course
  361. params[:course_ids].each do |course|
  362. option = {
  363. :exercise_name => @exercise.exercise_name,
  364. :exercise_status => 1,
  365. :user_id => User.current.id,
  366. :show_result => 1,
  367. :course_id => course.to_i,
  368. :time => @exercise.time,
  369. :exercise_description => @exercise.exercise_description
  370. }
  371. exercise = Exercise.create option
  372. @exercise.exercise_questions.each do |q|
  373. option = {
  374. :question_title => q[:question_title],
  375. :question_type => q[:question_type] || 1,
  376. :question_number => q[:question_number],
  377. :question_score => q[:question_score]
  378. }
  379. exercise_question = exercise.exercise_questions.new option
  380. for i in 1..q.exercise_choices.count
  381. choice_option = {
  382. :choice_position => i,
  383. :choice_text => q.exercise_choices[i-1][:choice_text]
  384. }
  385. exercise_question.exercise_choices.new choice_option
  386. end
  387. for i in 1..q.exercise_standard_answers.count
  388. standard_answer_option = {
  389. :exercise_choice_id => q.exercise_standard_answers[i-1][:exercise_choice_id],
  390. :answer_text => q.exercise_standard_answers[i-1][:answer_text]
  391. }
  392. exercise_question.exercise_standard_answers.new standard_answer_option
  393. end
  394. end
  395. exercise.save
  396. end
  397. respond_to do |format|
  398. format.js
  399. end
  400. end
  401. # 搜索当前用户任教的班级(不包含该试卷所在的班级)
  402. def search_courses
  403. @user = User.current
  404. if !params[:name].nil?
  405. search = "%#{params[:name].to_s.strip.downcase}%"
  406. @courses = @user.courses.not_deleted.where("courses.id != #{params[:course].to_i} and (#{Course.table_name}.id = #{params[:search].to_i } or #{Course.table_name}.name like :p)",:p=>search).reorder("created_at desc").select {|course| @user.allowed_to?(:as_teacher,course)}
  407. else
  408. @courses = @user.courses.not_deleted.where("courses.id != #{params[:course].to_i}").reorder("created_at desc").select {|course| @user.allowed_to?(:as_teacher,course)}
  409. end
  410. respond_to do |format|
  411. format.js
  412. end
  413. end
  414. # 发布试卷
  415. def publish_exercise
  416. @is_teacher = User.current.allowed_to?(:as_teacher,@course)
  417. @index = params[:index]
  418. @exercise.exercise_status = 2
  419. @exercise.publish_time = Time.now
  420. if @exercise.save
  421. @exercise.course.members.each do |m|
  422. @exercise.course_messages << CourseMessage.create(:user_id =>m.user_id, :course_id => @exercise.course.id, :viewed => false,:status=>2)
  423. end
  424. #redirect_to exercise_index_url(:course_id=> @course.id)
  425. respond_to do |format|
  426. format.js
  427. end
  428. end
  429. end
  430. # 重新发布试卷
  431. # 重新发布的时候会删除所有的答题
  432. def republish_exercise
  433. @is_teacher = User.current.allowed_to?(:as_teacher,@course)
  434. @index = params[:index]
  435. @exercise.exercise_questions.each do |exercise_question|
  436. exercise_question.exercise_answers.destroy_all
  437. end
  438. @exercise.course_messages.destroy_all
  439. @exercise.exercise_users.destroy_all
  440. @exercise.exercise_status = 1
  441. @exercise.publish_time = nil
  442. @exercise.save
  443. respond_to do |format|
  444. format.js
  445. end
  446. end
  447. def student_exercise_list
  448. =begin
  449. if @exercise.end_time <= Time.now
  450. @course.student.each do |student|
  451. if ExerciseUser.where("user_id = ? && exercise_id = ?",student.student_id,@exercise.id).empty?
  452. ExerciseUser.create(:user_id => student.student_id, :exercise_id => @exercise.id, :start_at => @exercise.end_time, :status => true,:score=>0)
  453. end
  454. s_score = calculate_student_score(@exercise, student.student)
  455. exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", student.student_id, @exercise.id).first
  456. exercise_user.update_attributes(:score => s_score)
  457. end
  458. end
  459. =end
  460. @name,@select_group = params[:name].to_s.strip || "",params[:group]
  461. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  462. if @is_teacher
  463. @all_exercises = @course.exercises.order("created_at desc")
  464. else
  465. @all_exercises = @course.exercises.where("exercise_status > 1").order("created_at desc")
  466. end
  467. student_id = @course.student.blank? ? "(-1)" : "(" + @course.student.map{|student| student.student_id}.join(",") + ")"
  468. if @select_group
  469. if @select_group == "0"
  470. none_group_students = @course.members.select{ |member| member.course_group_id == 0 }
  471. if none_group_students.empty?
  472. student_in_group = '(0)'
  473. else
  474. student_in_group = '(' + none_group_students.map{ |member| member.user_id }.join(',') + ')'
  475. end
  476. elsif @select_group == "-1"
  477. all_group_students = @course.members.select{ |member| member.course_group_id }
  478. if all_group_students.empty?
  479. student_in_group = '(0)'
  480. else
  481. student_in_group = '(' + all_group_students.map{ |member| member.user_id }.join(',') + ')'
  482. end
  483. else
  484. course_group = CourseGroup.find_by_id(@select_group)
  485. group_students = course_group.users
  486. if group_students.empty?
  487. student_in_group = '(0)'
  488. else
  489. student_in_group = '(' + group_students.map{ |user| user.id }.join(',') + ')'
  490. end
  491. end
  492. if @is_teacher || (!@exercise.exercise_users.where("user_id = #{User.current.id}").empty? && @exercise.end_time <= Time.now)
  493. @exercise_users_list = search_exercise_member @exercise.exercise_users.where("user_id in #{student_id} and user_id in #{student_in_group}"), @name
  494. @show_all = true;
  495. elsif !@exercise.exercise_users.where("user_id = #{User.current.id}").empty? && @exercise.end_time > Time.now
  496. @exercise_users_list = search_exercise_member @exercise.exercise_users.where("user_id = ? and user_id in #{student_id} and user_id in #{student_in_group}",User.current.id), @name
  497. else
  498. @exercise_users_list = []
  499. end
  500. else
  501. if @is_teacher || (!@exercise.exercise_users.where("user_id = #{User.current.id}").empty? && @exercise.end_time <= Time.now)
  502. @exercise_users_list = search_exercise_member @exercise.exercise_users.where("user_id in #{student_id}"), @name
  503. @show_all = true;
  504. elsif !@exercise.exercise_users.where("user_id = #{User.current.id}").empty? && @exercise.end_time > Time.now
  505. @exercise_users_list = search_exercise_member @exercise.exercise_users.where("user_id = ? and user_id in #{student_id}",User.current.id), @name
  506. else
  507. @exercise_users_list = []
  508. end
  509. end
  510. @exercise_count = @exercise.exercise_users.where("commit_status = 1 and user_id in #{student_id}").count
  511. @left_nav_type = 8
  512. respond_to do |format|
  513. format.js
  514. format.html
  515. format.xls {
  516. filename = "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@exercise.exercise_name}#{l(:excel_exercise_list)}.xls"
  517. send_data(exercise_to_xls(@exercise_users_list), :type => "text/excel;charset=utf-8; header=present",
  518. :filename => filename_for_content_disposition(filename))
  519. }
  520. end
  521. end
  522. # 学生提交答卷,选中答案的过程中提交
  523. def commit_answer
  524. eq = ExerciseQuestion.find(params[:exercise_question_id])
  525. # 已提交过的且是限时的则不允许答题
  526. if (has_commit_exercise?(@exercise.id,User.current.id) && (!User.current.admin?) && @exercise.time != -1) || @exercise.end_time < Time.now
  527. render :json => {:text => "failure"}
  528. return
  529. end
  530. if eq.question_type == 1
  531. # 单选题
  532. ea = ExerciseAnswer.find_by_exercise_question_id_and_user_id(params[:exercise_question_id],User.current.id)
  533. if ea.nil?
  534. # 尚未答该题,添加答案
  535. ea = ExerciseAnswer.new
  536. ea.user_id = User.current.id
  537. ea.exercise_question_id = params[:exercise_question_id]
  538. end
  539. #修改该题对应答案
  540. ea.exercise_choice_id = params[:exercise_choice_id]
  541. if ea.save
  542. # 保存成功返回成功信息及当前以答题百分比
  543. uncomplete_question = get_uncomplete_question(@exercise, User.current)
  544. if uncomplete_question.count < 1
  545. complete = 1;
  546. else
  547. complete = 0;
  548. end
  549. @percent = get_percent(@exercise,User.current)
  550. render :json => {:text => "ok" ,:complete => complete,:percent => format("%.2f" ,@percent)}
  551. else
  552. #返回失败信息
  553. render :json => {:text => "failure"}
  554. end
  555. elsif eq.question_type == 2
  556. #多选题
  557. ea = ExerciseAnswer.find_by_exercise_choice_id_and_user_id(params[:exercise_choice_id],User.current.id)
  558. if ea.nil?
  559. #尚未答该题,添加答案
  560. ea = ExerciseAnswer.new
  561. ea.user_id = User.current.id
  562. ea.exercise_question_id = params[:exercise_question_id]
  563. ea.exercise_choice_id = params[:exercise_choice_id]
  564. if ea.save
  565. uncomplete_question = get_uncomplete_question(@exercise, User.current)
  566. if uncomplete_question.count < 1
  567. complete = 1;
  568. else
  569. complete = 0;
  570. end
  571. is_answer = User.current.exercise_answer.where(:exercise_question_id => params[:exercise_question_id].to_i).count > 0
  572. @percent = get_percent(@exercise,User.current)
  573. render :json => {:text => "ok",:complete => complete,:percent => format("%.2f" ,@percent),:is_answer => is_answer}
  574. else
  575. render :json => {:text => "failure"}
  576. end
  577. else
  578. #pv不为空,则当前选项之前已被选择,再次点击则是不再选择该项,故删除该答案
  579. if ea.delete
  580. is_answer = User.current.exercise_answer.where(:exercise_question_id => params[:exercise_question_id].to_i).count > 0
  581. @percent = get_percent(@exercise, User.current)
  582. render :json => {:text => "false" ,:percent => format("%.2f" , @percent),:is_answer => is_answer}
  583. else
  584. render :json => {:text => "failure"}
  585. end
  586. end
  587. elsif eq.question_type == 3 || eq.question_type == 4
  588. #单行文本,多行文本题
  589. ea = ExerciseAnswer.find_by_exercise_question_id_and_user_id(params[:exercise_question_id], User.current.id)
  590. if ea.nil?
  591. # ea为空之前尚未答题,添加答案
  592. if params[:answer_text].nil? || params[:answer_text].blank?
  593. #用户提交空答案,视作不作答
  594. @percent = get_percent(@exercise,User.current)
  595. render :json => {:text => "",:percent => format("%.2f", @percent)}
  596. else
  597. #添加答案
  598. ea = ExerciseAnswer.new
  599. ea.user_id = User.current.id
  600. ea.exercise_question_id = params[:exercise_question_id]
  601. ea.answer_text = params[:answer_text]
  602. if ea.save
  603. uncomplete_question = get_uncomplete_question(@exercise, User.current)
  604. if uncomplete_question.count < 1
  605. complete = 1;
  606. else
  607. complete = 0;
  608. end
  609. @percent = get_percent(@exercise,User.current)
  610. render :json => {:text => ea.answer_text,:complete => complete,:percent => format("%.2f",@percent)}
  611. else
  612. render :json => {:text => "failure"}
  613. end
  614. end
  615. else
  616. # ea不为空说明用户之前已作答
  617. if params[:answer_text].nil? || params[:answer_text].blank?
  618. # 用户提交空答案,视为删除答案
  619. if ea.delete
  620. @percent = get_percent(@exercise,User.current)
  621. render :json => {:text => "",:percent => format("%.2f", @percent)}
  622. else
  623. render :json => {:text => "failure"}
  624. end
  625. else
  626. #用户修改答案
  627. ea.answer_text = params[:answer_text]
  628. if ea.save
  629. @percent = get_percent(@exercise,User.current)
  630. render :json => {:text => ea.answer_text,:percent => format("%.2f", @percent)}
  631. else
  632. render :json => {:text => "failure"}
  633. end
  634. end
  635. end
  636. else
  637. render :json => {:text => "failure"}
  638. end
  639. end
  640. # 提交问卷
  641. def commit_exercise
  642. # 老师不需要提交
  643. if User.current.allowed_to?(:as_teacher,@course)
  644. # if @exercise.publish_time.nil? || @exercise.publish_time <= Time.now
  645. # @exercise.update_attributes(:exercise_status => 2)
  646. # @exercise.update_attributes(:publish_time => Time.now)
  647. # course = @exercise.course
  648. # course.members.each do |m|
  649. # @exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
  650. # end
  651. # redirect_to exercise_url(@exercise)
  652. # return
  653. # elsif @exercise.publish_time > Time.now
  654. # redirect_to exercise_url(@exercise)
  655. # return
  656. # end
  657. # redirect_to exercise_url(@exercise)
  658. # REDO: 提示提交成功
  659. else
  660. # 更新提交状态
  661. cur_exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", User.current, @exercise.id).first
  662. cur_exercise_user.update_attributes(:status => 1, :commit_status => 1)
  663. if @exercise.time && @exercise.time != -1
  664. score = calculate_student_score(@exercise, User.current)
  665. cur_exercise_user.update_attributes(:score => score)
  666. end
  667. # 答题过程中需要统计完成量
  668. #@uncomplete_question = get_uncomplete_question(@exercise, User.current)
  669. # 获取改学生的考试得分
  670. #@score = calculate_student_score(@exercise, User.current)
  671. # @score = 100
  672. # if @uncomplete_question.count < 1
  673. # # 查看是否有已提交记录
  674. # cur_exercise_user.score = @score
  675. # if cur_exercise_user.save
  676. # #redirect_to poll_index_path(:polls_group_id => @course.id,:polls_type => 'Course')
  677. # @status = 0 #提交成功
  678. # else
  679. # @status = 2 #未知错误
  680. # end
  681. # else
  682. # @status = 1 #有未做得必答题
  683. # end
  684. # @save = params[:save].to_i if params[:save]
  685. respond_to do |format|
  686. format.js
  687. end
  688. end
  689. end
  690. # 获取学生未答情况
  691. def get_student_uncomplete_question
  692. time_limit = @exercise.time == -1 || @exercise.time.nil?
  693. uncomplete_count = get_uncomplete_question(@exercise, User.current).count
  694. render :json => {:time_limit => time_limit, :uncomplete_count => uncomplete_count}
  695. end
  696. # 主观题打分
  697. def edit_question_score
  698. exercise_user = @exercise.exercise_users.where(:user_id => params[:user_id].to_i).first
  699. exercise_answer = ExerciseAnswer.where(:user_id => params[:user_id].to_i, :exercise_question_id => params[:exercise_question_id].to_i).first
  700. exercise_question = ExerciseQuestion.where(:id => params[:exercise_question_id].to_i).first
  701. if exercise_user && exercise_answer && exercise_question
  702. score = params[:score].to_i
  703. unless score > exercise_question.question_score || score < 0
  704. exercise_answer.update_attributes(:score => score)
  705. exercise_user.update_attributes(:subjective_score => calculate_subjective_score(@exercise, exercise_user.user))
  706. exercise_user.update_attributes(:score => ((exercise_user.objective_score > 0 ? exercise_user.objective_score : 0) + (exercise_user.subjective_score > 0 ? exercise_user.subjective_score : 0)))
  707. render :json => {:status => 1, :score => score, :total_score => exercise_user.score}
  708. else
  709. render :json => {:status => 2}
  710. end
  711. else
  712. render :json => {:status => 0}
  713. end
  714. end
  715. #查看学生的答卷情况
  716. def show_student_result
  717. @user = User.find params[:user_id]
  718. @can_edit_excercise = false
  719. @exercise_questions = @exercise.exercise_questions
  720. #score = calculate_student_score(@exercise, @user)
  721. #eu = get_exercise_user(@exercise.id, @user.id)
  722. #eu.update_attributes(:score => score)
  723. @exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", @user.id, @exercise.id).first
  724. @left_nav_type = 8
  725. respond_to do |format|
  726. format.html {render :layout => 'base_courses'}
  727. end
  728. end
  729. # 计算学生得分
  730. def calculate_student_score(exercise, user)
  731. score = 0
  732. score1 = 0
  733. score2 = 0
  734. score3 = 0
  735. exercise_qustions = exercise.exercise_questions
  736. exercise_qustions.each do |question|
  737. answer = get_user_answer(question, user)
  738. standard_answer = get_user_standard_answer(question, user)
  739. unless answer.empty?
  740. # 问答题有多个答案
  741. if question.question_type == 3 && !standard_answer.empty?
  742. if standard_answer.include?(answer.first.answer_text)
  743. score1 = score1+ question.question_score unless question.question_score.nil?
  744. end
  745. elsif question.question_type == 1 && !standard_answer.nil?
  746. if answer.first.exercise_choice.choice_position == standard_answer.exercise_choice_id
  747. score2 = score2 + question.question_score unless question.question_score.nil?
  748. end
  749. elsif question.question_type == 2 && !standard_answer.nil?
  750. arr = get_mulscore(question, user)
  751. if arr.to_i == standard_answer.exercise_choice_id
  752. score3 = score3 + question.question_score unless question.question_score.nil?
  753. end
  754. # ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id)
  755. # arr = []
  756. # ecs.each do |ec|
  757. # arr << ec.exercise_choice.choice_position
  758. # end
  759. # arr.sort
  760. # arr = arr.join("")
  761. # if arr.to_i == standard_answer.exercise_choice_id
  762. # score3 = score + question.question_score unless question.question_score.nil?
  763. # end
  764. end
  765. end
  766. end
  767. score = score1 + score2 + score3
  768. end
  769. # 计算主观题总分
  770. def calculate_subjective_score exercise, user
  771. score = 0
  772. exercise_questions = exercise.exercise_questions.where(:question_type => 4)
  773. exercise_answers = user.exercise_answer.where(:exercise_question_id => exercise_questions.map(&:id))
  774. exercise_answers.each do |ea|
  775. if ea.score != -1
  776. score += ea.score
  777. end
  778. end
  779. score
  780. end
  781. #导入试卷的弹框
  782. def other_exercise
  783. # 查作者是我,或者作者是当前课程的老师,且不在当前课程内的试卷 进行导入
  784. @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc"
  785. @r_sort = @b_sort == "desc" ? "asc" : "desc"
  786. courses = User.current.courses.not_deleted.select { |course| User.current.allowed_to?(:as_teacher,course)}
  787. course_ids = courses.empty? ? "(-1)" : "(" + courses.map { |course| course.id}.join(',') + ")"
  788. #none_courses = User.current.courses.where("is_delete = 1 or #{Course.table_name}.id = #{params[:course_id].to_i}")
  789. #none_course_ids = none_courses.empty? ? "(-1)" : "(" + none_courses.map { |course| course.id}.join(',') + ")"
  790. @exercises = Exercise.where("(user_id = #{User.current.id} or course_id in #{course_ids}) and course_id != #{params[:course_id].to_i}").order("#{@order} #{@b_sort}")
  791. @course_id = params[:course_id]
  792. @is_remote = true
  793. @ex_count = @exercises.count
  794. @ex_pages = Paginator.new @ex_count, 10, params['page'] || 1
  795. @offset ||= @ex_pages.offset
  796. @exercises = paginateHelper @exercises,10
  797. respond_to do |format|
  798. format.js
  799. end
  800. end
  801. #搜索导入页面的试卷
  802. def search_exercises
  803. @order,@b_sort = params[:order] || "created_at",params[:sort] || "desc"
  804. @r_sort = @b_sort == "desc" ? "asc" : "desc"
  805. search = params[:name].to_s.strip.downcase
  806. courses = User.current.courses.not_deleted.select { |course| User.current.allowed_to?(:as_teacher,course)}
  807. course_ids = courses.empty? ? "(-1)" : "(" + courses.map { |course| course.id}.join(',') + ")"
  808. @exercises = Exercise.where("(user_id = #{User.current.id} or course_id in #{course_ids}) and course_id != #{params[:course_id].to_i} and exercise_name like '%#{search}%'").order("#{@order} #{@b_sort}")
  809. @is_remote = true
  810. @ex_count = @exercises.count
  811. @ex_pages = Paginator.new @ex_count, 10, params['page'] || 1
  812. @offset ||= @ex_pages.offset
  813. @exercises = paginateHelper @exercises,10
  814. @course_id = params[:course_id]
  815. respond_to do |format|
  816. format.js
  817. end
  818. end
  819. #将选择的试卷导入到班级
  820. def import_other_exercise
  821. course_id = params[:course_id]
  822. @course = Course.find(course_id)
  823. params[:exercise_id].each_with_index do |ex,i|
  824. exercise = Exercise.find(ex)
  825. option = {
  826. :exercise_name => exercise.exercise_name,
  827. :exercise_status => 1,
  828. :user_id => User.current.id,
  829. :show_result => 1,
  830. :course_id => @course.id,
  831. :time => exercise.time,
  832. :exercise_description => exercise.exercise_description
  833. }
  834. @exercise = Exercise.create option
  835. exercise.exercise_questions.each do |q|
  836. option = {
  837. :question_title => q[:question_title],
  838. :question_type => q[:question_type] || 1,
  839. :question_number => q[:question_number],
  840. :question_score => q[:question_score]
  841. }
  842. @exercise_question = @exercise.exercise_questions.new option
  843. for i in 1..q.exercise_choices.count
  844. choice_option = {
  845. :choice_position => i,
  846. :choice_text => q.exercise_choices[i-1][:choice_text]
  847. }
  848. @exercise_question.exercise_choices.new choice_option
  849. end
  850. for i in 1..q.exercise_standard_answers.count
  851. standard_answer_option = {
  852. :exercise_choice_id => q.exercise_standard_answers[i-1][:exercise_choice_id],
  853. :answer_text => q.exercise_standard_answers[i-1][:answer_text]
  854. }
  855. @exercise_question.exercise_standard_answers.new standard_answer_option
  856. end
  857. end
  858. @exercise.save
  859. end
  860. respond_to do |format|
  861. format.js
  862. end
  863. end
  864. private
  865. #测验列表转换为excel
  866. def exercise_to_xls items
  867. xls_report = StringIO.new
  868. book = Spreadsheet::Workbook.new
  869. sheet1 = book.create_worksheet :name => "exercise"
  870. blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
  871. sheet1.row(0).default_format = blue
  872. sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_objective_score),l(:excel_subjective_score),l(:excel_f_score),l(:excel_answer_time)])
  873. count_row = 1
  874. items.each do |exercise|
  875. sheet1[count_row,0]=exercise.user.id
  876. sheet1[count_row,1] = exercise.user.lastname.to_s + exercise.user.firstname.to_s
  877. sheet1[count_row,2] = exercise.user.login
  878. sheet1[count_row,3] = exercise.user.user_extensions.student_id
  879. sheet1[count_row,4] = exercise.user.mail
  880. sheet1[count_row,5] = exercise.objective_score == -1 ? "0.0" : format("%.1f",exercise.objective_score)
  881. sheet1[count_row,6] = exercise.subjective_score == -1 ? "0.0" : format("%.1f",exercise.subjective_score)
  882. sheet1[count_row,7] = exercise.score
  883. sheet1[count_row,8] = exercise.commit_status == 0 ? l(:excel_no_answer) : format_time(exercise.created_at)
  884. count_row += 1
  885. end
  886. book.write xls_report
  887. xls_report.string
  888. end
  889. #根据条件过滤作业结果
  890. def search_exercise_member exercises,name
  891. if name == ""
  892. select_exercises = exercises
  893. else
  894. name = name.downcase
  895. select_exercises = exercises.select{ |exercise|
  896. exercise.user[:login].to_s.downcase.include?(name) || exercise.user.user_extensions[:student_id].to_s.downcase.include?(name) || (exercise.user[:lastname].to_s.downcase + exercise.user[:firstname].to_s.downcase).include?(name)
  897. }
  898. end
  899. select_exercises
  900. end
  901. # ExerciseUser记录用户是否已提交问卷有对应的记录则已提交,没有则新建一个
  902. def get_exercise_user exercise_id,user_id
  903. eu = ExerciseUser.find_by_exercise_id_and_user_id(exercise_id,user_id)
  904. if eu.nil?
  905. eu = ExerciseUser.new
  906. end
  907. eu
  908. end
  909. # 获取当前学生回答问题的答案
  910. def get_user_answer(question,user)
  911. # user_answer = ExerciseAnswer.where("user_id=? and exercise_question_id=?", user.id, question.id).first
  912. user_answer = question.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id}")
  913. user_answer
  914. end
  915. # 获取问题的标准答案
  916. def get_user_standard_answer(question,user)
  917. if question.question_type == 3
  918. standard_answer =[]
  919. question.exercise_standard_answers.each do |answer|
  920. standard_answer << answer.answer_text
  921. end
  922. else
  923. standard_answer = question.exercise_standard_answers.first
  924. end
  925. standard_answer
  926. end
  927. # 是否完成了答题
  928. def get_complete_question(exercise,user)
  929. questions = exercise.exercise_questions
  930. complete_question = []
  931. questions.each do |question|
  932. answers = get_user_answer(question,user)
  933. if !(answers.nil? || answers.count < 1)
  934. complete_question << question
  935. end
  936. end
  937. complete_question
  938. end
  939. # 获取答题百分比
  940. def get_percent exercise,user
  941. complete_count = get_complete_question(exercise,user).count
  942. if exercise.exercise_questions.count == 0
  943. return 0
  944. else
  945. return (complete_count.to_f / exercise.exercise_questions.count.to_f)*100
  946. end
  947. end
  948. def remove_invalid_exercise(course)
  949. exercises = course.exercises.where("exercise_name=?","")
  950. unless exercises.empty?
  951. exercises.each do |exercise|
  952. if exercise.exercise_questions.empty?
  953. exercise.destroy
  954. end
  955. end
  956. end
  957. end
  958. def find_exercise_and_course
  959. @exercise = Exercise.find params[:id]
  960. @course = Course.find @exercise.course_id
  961. rescue Exception => e
  962. render_404
  963. end
  964. def find_course
  965. @course = Course.find params[:course_id]
  966. rescue Exception => e
  967. render_404
  968. end
  969. end

软件技术创新是当今国家整体创新能力的重要基础和发展引擎。近年来,大众参与的软件创新与创业活动已经成为网络时代软件开发和应用的新形态,正在快速改变着全球软件创新模式和软件产业格局。 ...