好的,我正在开展测验,作为我的应用程序的一部分。我有三个嵌套模型测验,问题,答案。
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
问题是上面的代码会在同一页面上显示所有问题。
我真正想要的是在每个问题中单独显示每个问题,每页一个问题。因此,一旦用户回答了一个问题,他们就会点击一个按钮,它将使用下一个问题重新渲染视图。
无论如何,我有一段时间试图弄清楚如何做到这一点。先感谢您!哦,如果您需要查看我的代码,请告诉我!
答案 0 :(得分:1)
首先:您已设置关联(has_many :questions
),因此您只需使用@quiz.questions
代替手动搜索(Question.where...
)。
您只需指定排序顺序,然后根据最小值获取单个记录。我们假设您选择id
(created_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) %>