0

这是我的模型。

民意调查

class Survey < ActiveRecord::Base
  belongs_to :user
  has_many :questions, :dependent => :destroy
  accepts_nested_attributes_for :questions, :reject_if => lambda {|a| a[:content].blank?}, :allow_destroy => true

问题:有 is_correct(boolean) 列表示学生是否得到正确答案。

class Question < ActiveRecord::Base
  belongs_to :survey
  has_many :answers, :dependent => :destroy
  accepts_nested_attributes_for :answers, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true

答案:有教师检查进行调查(测试)的正确(布尔)列,有学生标记参加测试的用户回答(布尔)列。

class Answer < ActviveRecord::Base
  belongs_to :question

我想比较 Answer 模型中的正确和 user_answer,并将答案保存到 Question 模型中的 is_correct 中。

不仅有生成问题和答案的基本 CRUD 方法,还有用于回答(GET)/评分(POST)考试、显示(GET)结果的三种额外方法。我可以从 rake 路由的结果中检查这条路由没有问题。

更新问题:我更改了控制器和问题模型。

以下是调查控制器中的方法。

def answering
  @survey = Survey.find(params[:id])
end

def grading
  @survey = Survey.find(params[:id])
  @survey.user_id = current_user.id
  @survey.questions.each do |q|
    q.auto_check 
  end 
  redirect_to results_survey_path(@survey)
end

def results
end

这是问题控制器。

def auto_check
  answers.each do |a|
    is_correct = true if a.user_answer and a.correct 
    self.save!
  end
end

rake 路由的结果。

$ rake routes | grep survey
(in /home/seriousin/ClassCasts)
        answering_survey GET    /surveys/:id/answering(.:format)            surveys#answering
          grading_survey POST   /surveys/:id/grading(.:format)              surveys#grading
          results_survey GET    /surveys/:id/results(.:format)              surveys#results
                 surveys GET    /surveys(.:format)                          surveys#index
                         POST   /surveys(.:format)                          surveys#create
              new_survey GET    /surveys/new(.:format)                      surveys#new
             edit_survey GET    /surveys/:id/edit(.:format)                 surveys#edit
                  survey GET    /surveys/:id(.:format)                      surveys#show
                         PUT    /surveys/:id(.:format)                      surveys#update
                         DELETE /surveys/:id(.:format)                      surveys#destroy

*问题是我不能调用调查对象保存的用户输入。*

我让结果方法为空。使用redirect_to,我不需要生成另一个调查对象。

  def results
      #@survey = Survey.where(params[:survey_id])
  end

我认为没关系。因为我可以将调查对象作为分级方法的参数传递。

def grading
  @survey = Survey.find(params[:id])
  @survey.user_id = current_user.id
  @survey.questions.each do |q|
    q.auto_check 
  end 
  redirect_to results_survey_path(@survey)
end

但结果是'nil:NilClass'的'未定义方法'名称'......我如何使用包含用户输入的对象?

谢谢先进。

4

2 回答 2

0

auto_check方法应该在问题模型中,而不是在问题控制器中。

于 2013-08-16T07:16:24.423 回答
0

@survey.questions.each为您提供了 Question 模型的实例,并且您正在调用其中定义的方法QuestionsController。如果您auto_check是模型的成员,Question您将不会收到此错误。

如果您想保留auto_check方法,QuestionsController那么我认为您应该将question实例作为参数传递,如下所示:

def auto_check(question)
  question.answers.each do |a|
    is_correct = true if a.user_answer and a.correct 
    ...
  end
end

并按如下方式更新调用:

@survey.questions.each do |q|
  auto_check(q)
end
于 2013-08-16T07:22:36.257 回答