2017-01-10 2 views
0

Ich habe den folgenden Code in meinem Controller:Schienen 5: Wie umgestalten diese Controller-Code auf das Modell?

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 

Und ich habe folgendes Modell:

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

ich auf die dünne Controller Fett Modelle Paradigma einhalten zu lernen bin versucht, aber da Rails Sitzungsvariablen können nicht an das Modell übergeben werden. Wie würde ich dies zum Modell umgestalten?

+0

Diese Frage gehört nicht hierher und sollte in [CodeReview] (http: // codereview. stackexchange.com/). – 31piy

Antwort

0

Ich denke, der beste Weg, um fetten Modellen dünne Controller in diesem Fall zu folgen wäre, ein Modell für das "Quiz" selbst zu erstellen, dann "Quiz" würde die "Vocab" Fragen nachgefragt/beantwortet verfolgen. Die Sitzung würde das Quiz nur mit einer Sitzungs-ID referenzieren. Vielleicht möchten Sie auch das 'Quiz' nach Abschluss der Sitzung zerstören oder für Quiz-Analysen aufbewahren ...

Verwandte Themen