Rails 4,使用Model.where(related_model_id:1)检索了许多记录,如何在单个视图中显示每个记录?

时间:2014-12-04 22:21:07

标签: ruby-on-rails rails-activerecord nested-attributes

好的,我正在开展测验,作为我的应用程序的一部分。我有三个嵌套模型测验,问题,答案。

class Quiz < ActiveRecord::Base
  belongs_to :video
  has_many :questions
  has_many :answers, through: :questions

  accepts_nested_attributes_for :questions, 
     :reject_if => lambda { |a| a[:content].blank? }, allow_destroy: true
end

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

class Answer < ActiveRecord::Base
  belongs_to :question
end

在控制器操作测验中#show我可以使用

检索特定测验的所有问题
 def show    
   @quiz = Quiz.find(params[:id])
   @question = Question.where(quiz_id: @quiz)
 end

我可以使用

在quizzes / show.html.haml视图中显示每个问题
- @question.each do |question|
  = question.content 

问题是上面的代码会在同一页面上显示所有问题。

我真正想要的是在每个问题中单独显示每个问题,每页一个问题。因此,一旦用户回答了一个问题,他们就会点击一个按钮,它将使用下一个问题重新渲染视图。

无论如何,我有一段时间试图弄清楚如何做到这一点。先感谢您!哦,如果您需要查看我的代码,请告诉我!

1 个答案:

答案 0 :(得分:1)

首先:您已设置关联(has_many :questions),因此您只需使用@quiz.questions代替手动搜索(Question.where...)。

您只需指定排序顺序,然后根据最小值获取单个记录。我们假设您选择idcreated_at或任何自定义字段应以相似的方式工作)。

def show    
  @min_id = params[:min_id]
  @quiz = Quiz.find(params[:id])
  @questions = @quiz.questions.order("id ASC")
  if @min_id
    @question = @questions.where("id > ?", @min_id).first
  else
    @question = @questions.first
  end
end

然后,您可以在下一个问题的链接中添加当前问题ID。可能是这样的(erb而不是haml,但你明白了;)):

<%= @question.content %>

<%= link_to "Next question", quiz_path(@quiz, :min_id => @question.id) %>