将提交操作与RubyonRails中的导航相结合



我想用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

最新更新