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

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

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