Rails说实例化的变量是零

时间:2016-06-15 16:58:36

标签: ruby-on-rails ruby

我正在创建一个测验网站。我有一个班级Session,其中包含当前问题以及该人员正确的问题数量以及使用startnext方法的控制器。

以下是会话模型:

class Session < ActiveRecord::Base
    attr_accessor :questionNumber, :currentQuestion, :correctQuestions

    def start
        self.questionNumber = 1
        self.correctQuestions = 0
    end
end

这是会话控制器:

class SessionsController < ApplicationController
    def start
        @currentSession = Session.new
        @currentSession.start
        @currentSession.currentQuestion = Question.find(@currentSession.questionNumber)
        render 'session'
    end

    def next
        @currentSession.questionNumber += 1
        @currentSession.currentQuestion = Question.find(@currentSession.questionNumber)
        render 'session'
    end
end

我从我视图中的链接中调用start,当他们回答问题时,我会调用next(再次从视图中)。我收到错误:"undefined method `questionNumber' for nil:NilClass"

如何在方法调用之间将@currentSession重置为nil?类中是否共享@变量?

2 个答案:

答案 0 :(得分:0)

不,实例变量不在呼叫之间共享,它们是共享的#34;方法之间,因为它们是对象的属性(作为控制器,是的,我知道共享这个词不是一个好词)。您可以将会话的ID传递到网址(params[:session_id])中,也可以将其存储在session中。

答案 1 :(得分:0)

@variables是实例变量,而不是类实例。 Rails为每个请求创建一个控制器实例,因此实例变量无济于事。还要记住,后续请求可能不会出现在同一个rails worker进程中。

您可以使用导轨session在Cookie中存储一些数据,并从这些数据中初始化Session

class SessionsController < ApplicationController
    def start
        session[:current_question] = 1
        session[:correct_answers] = 0
        @currentQuestion = Question.find(session[:current_question])
        render 'session'
    end

    def next
        session[:current_question] += 1
        @currentQuestion = Question.find(session[:current_question])
        render 'session'
    end
end

请参阅rails guide for session