Rails 5:如何将此控制器代码重构为模型?

时间:2017-01-10 23:40:04

标签: ruby-on-rails refactoring

我的控制器中有以下代码:

class VocabsController < ApplicationController
  before_action :require_login, except: [:index, :quiz, :answer, :result]

...
def quiz
  #Initiate score session
  session[:score] ||= 0
  #Initiate session to hold questions already asked
  session[:already_asked] ||= []
  #Total score
  session[:amount_questions] = Vocab.all.length

  #Get list of words that hasn't been asked before
  @left_words = Vocab.all.where.not(id: session[:already_asked])

  #Questions remaining
  @questions_remaining = @left_words.length - 4

  #Pick four words from leftover words list
  @four = @left_words.shuffle.take(4)

  #Create question variable if there are enough words left in list
  if @left_words.length >= 4
    @question = @four.first.word
  else
    redirect_to result_path
  end

  #save score to user database if all questions done and logged in
  if @questions_remaining == 0
    high_score = Score.new
    high_score.user_id = session[:user_id]
    high_score.score = session[:score] /  session[:amount_questions].to_f
    high_score.save
    redirect_to result_path
  end
end

def answer
  #Keep score and question id's already asked
  if params[:answer] == params[:orig]
    session[:score] += 1
    session[:already_asked] << params[:answer].to_i
    flash[:notice] = "You got it right!"
    redirect_to quiz_path
  else
    session[:already_asked] << params[:orig].to_i
    flash[:notice] = "Sorry, wrong answer!"
    redirect_to quiz_path
  end
end

我有以下型号:

class Vocab < ActiveRecord::Base
  validates :word, :definition, presence: true
end

我正在努力学习坚持瘦瘦的控制器胖模型范例,但由于Rails不让会话变量传递给模型,我该如何将其重构为模型?

1 个答案:

答案 0 :(得分:0)

我认为在这种情况下,关注胖模特瘦身控制器的最佳方法是为“测验”创建一个模型。然后本身就是测验&#39;会跟踪“词汇”。提问/回答的问题。会话将仅使用会话ID引用测验。你也可以想要破坏这个测验&#39;会话结束后或保留它们进行测验分析...

相关问题