我想用RubyonRails构建一个多选测试,但尽管我已经实现了,但我仍然想改进我的导航。
目前,我有两个按钮:一个用于提交quiz_guess(这是Answer的一个属性),另一个用于选择下一个:问题。我想把这两个按钮合并为一个按钮,这样我就不必首先更新属性,然后选择下一个问题。
你是怎么做到的?
我的问题控制器:
def quiz_guess
@survey = Survey.first
Answer.update(params[:answers].keys, params[:answers].values)
if @survey.save
flash[:notice] = "Guess saved successfully."
redirect_to(:action => 'show_quiz', :id => @survey.next, :survey_id => @survey.id)
else
render 'show'
end
end
def show_quiz
@answer = Answer.find(params[:id]) #answer
@answers = Answer.where(:survey_id => @survey.id)
@question = Question.find(params[:id])
@questions = Question.where(:survey_id => @survey.id)
@surveys = Survey.all
@survey = Survey.find(params[:id])
end
我的节目_测验视图:
<%= form_tag quiz_guess_questions_path, :method => :put do %>
<% for question in @survey.questions do %>
<li><%= question.content %></li>
<% for answer in question.answers do %>
<li>
<%= fields_for "answers[]", answer do |f| %>
<%= answer.content %>
<%= f.check_box :guess, :checked => false %>
<% end %>
</li>
<% end %>
<% end %>
<%= submit_tag "Guess" %>
<% end %>
<%= link_to t('.back', :default => t("helpers.links.back")), surveys_path, :survey_id => @survey.id, :class => 'btn btn-default' %>
<%= link_to t('Previous question', :default => t("helpers.links.previous")), {:action => 'show', :id => @survey.previous, :survey_id => @survey.id}, :class => 'btn btn-default' %>
<%= link_to t('Next question', :default => t("helpers.links.next")), {:action => 'show', :id => @survey.next, :survey_id => @survey.id}, :class => 'btn btn-default' %>
我的型号:
def next
Survey.limit(1).order("id ASC").where("id > ?", id).first
end
def previous
Survey.limit(1).order("id DESC").where("id < ?", id).last
end
我想改进您的next
(和previous
)函数。首先,您不需要有limit(1)
,而末尾有.first
或.last
。CCD_ 6和CCD_。
问题是,当您在上一张唱片上调用@survey.next
时,它将不指向任何内容。这里有两种选择。首先,您可以使用复选框,如果next
返回nil
,则禁用下一个按钮。
其次,使顺序循环。在最后一次调查中单击next
将转到第一次调查,反之亦然。方法如下:
def next
Survey.order("id ASC").where("id > ?", id).first || Survey.first
end
def previous
Survey.order("id DESC").where("id < ?", id).last || Survey.last
end