Ruby on rails 在RubyonRails中结合提交操作和导航

Ruby on rails 在RubyonRails中结合提交操作和导航,ruby-on-rails,Ruby On Rails,我想在RubyonRails中构建一个选择题测验,但是尽管我已经完成了,但我仍然想改进我的导航 目前,我有两个按钮:一个用于提交测验猜测(这是答案的一个属性),另一个用于选择下一个:问题。我想将这两个按钮组合成一个按钮,这样我就不必首先更新属性,然后选择下一个问题 你是怎么做的 我的问题是: def quiz_guess @survey = Survey.first Answer.update(params[:answers].keys, params[:answers].v

我想在RubyonRails中构建一个选择题测验,但是尽管我已经完成了,但我仍然想改进我的导航

目前,我有两个按钮:一个用于提交测验猜测(这是答案的一个属性),另一个用于选择下一个:问题。我想将这两个按钮组合成一个按钮,这样我就不必首先更新属性,然后选择下一个问题

你是怎么做的

我的问题是:

  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
我的show_测验视图:

     <%= 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' %>
:put do%>
  • 假%>
  • t(“helpers.links.back”)),调查路径,:survey\u id=>@survey.id,:class=>'btn btn默认值'%> t(“helpers.links.previous”),{:action=>'show',:id=>@survey.previous,:survey_id=>@survey.id},:class=>'btn btn default'> t(“helpers.links.next”),{:action=>'show',:id=>@survey.next,:survey\u 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
    
    def next
    调查。限额(1)。顺序(“id ASC”)。其中(“id>?”,id)。第一
    结束
    def先前版本
    调查。限制(1)。顺序(“id描述”)。其中(“id<?”,id)。最后
    结束
    
    我想改进您的
    下一个
    (和
    上一个
    )功能。首先,当您在末尾有
    .First
    时,您不需要有
    限制(1)
    .first
    .last
    每个保证只返回一条记录

    问题是当您调用
    @survey时。下一个
    在您的上一条记录上,它将不会指向任何内容。这里你有两个选择。首先,您可以使用检查,如果
    next
    返回
    nil
    ,请禁用next按钮

    第二,使顺序循环。点击最后一次调查的
    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
    
    def next
    Survey.order(“id ASC”)。其中(“id>?”,id)。first | | Survey.first
    结束
    def先前版本
    调查。顺序(“id描述”)。其中(“id<?”,id)。最后一次| |调查。最后一次
    结束
    
    非常感谢您的评论。我遇到的问题是,我在测验中调用@survey=survey.first,因此它将始终返回到第一条记录。如果我写
    @survey=survey.find(params[:id])
    它会给我一个RecordNotFound错误-找不到带有'id'的记录=你能做
    返回render json:params
    作为你方法的第一行,并且可以检查你收到的参数是什么吗?
    {“答案”:{“1”:{“猜测”:“0”},“2”:{“猜测”:“1”},“3”:{“猜测”:“0”},“4”:{“猜测”:“1”},“提交”:“猜测”,“utf8”:”✓","_方法“:“放置”、“真实性”令牌“:“W3j3HnqgsCT+5E3XcmmZ0gU/Xj/V0btscAmG/BBPT0TU9DNSHI8GOSGWYPM10KRJHIHEYRECCZPLR5IOD3VXQ=”,“控制器“:“问题”、“操作”:“测验猜测”}
    非常感谢您的帮助。@ljnissen显然,您在
    参数中没有收到
    id
    。有点不对劲。