我正在创建一个测验网站。我有一个班级Session
,其中包含当前问题以及该人员正确的问题数量以及使用start
和next
方法的控制器。
以下是会话模型:
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
?类中是否共享@
变量?
答案 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