Ruby测验设置

时间:2014-01-29 18:23:19

标签: ruby-on-rails ruby ruby-on-rails-4

在列出的第一个答案的评论中得到了答案,它一直在验证,我只需要将Flash添加到视图中。

如何更改此代码以验证答案是否正确?

我遵循了本教程http://quizzsystem.comyr.com/web-page/

  • 我点击提交回答按钮时出现的错误是“没有路由匹配[POST]”/ quizzs / check / 1“ - 所以看起来它没有验证答案并重定向但只是搜索另一个页面叫“检查”显示。

它应该做的是对答案运行检查(/quizzs_controller.rb)以验证它是否正确

/quizzs_controller.rb

class QuizzsController < ApplicationController
  before_action :set_quizz, only: [:show, :edit, :update, :destroy]
  before_filter :authenticate, :except=>[:home, :answering, :answer, :check]

 ...

 def check
   @quizz = Quizz.find(params[:id])
   respond_to do |format|
     if params[:ans][0].to_i==@quizz.correctAns
      flash[:notice] = "<b>Congratulation. You gave the correct answer to the question: " + @quizz.question + "</b>"  
       format.html { redirect_to({:controller => "quizzs", :action =>  "answering",:id=>"1" } ) }
      format.xml { head :ok }
    else
      flash[:notice] = "<b p style='color: red'>I am sorry but that is not the right answer to the question: " + @quizz.question + "</b>"
      format.html { redirect_to({:controller => "quizzs", :action =>   "answering",:id=>"1" } ) }
      format.xml { head :ok }
    end 
  end
 end

...

因此,当您点击下方视图中的按钮时,会运行“检查”以验证答案,在重定向到/answering.html.erb的页面上显示相应的消息。

/answer.html.erb

*我在form_tag之前添加了“=”符号,这是原始代码的唯一更改(除非有错字我还没有抓到)

   ...


  <%= form_tag( :action => "check",:id => @quizz.id) do %>
<p>
  <b>The correct answer is number: </b>
   <%= text_field :ans,params[:ans]%>
 </p>

<p><%= submit_tag("check")%></P>

    <%end%>

<%= link_to 'Back', {:controller => "quizzs", :action => "answering",:id=>"1" } %>

...

回溯到此页面并显示消息

/answering.html.erb

<h2>Which question do you want to answer</h2>
<table>
<tr>
    <th>Question</th>
</tr>
<%@quizzs.each do |quizz|%>
<tr>
    <td><%=h quizz.question %></td>
    <td><%= link_to '<> Answer this', :controller => "quizzs", :action => "answer", :id =>quizz.id%></td>
</tr>
<%end%>
</table>
<br />

但相反发生的事情似乎是寻找一条名为“检查”的路线,而不是验证问题是否正确。

我希望这是对我的问题的更好的介绍,我对这些东西还是新手。

2 个答案:

答案 0 :(得分:1)

资源:quizzs 只会生成创建/读取/更新/销毁操作的路由。对于控制器中的任何自定义操作,需要将新路由条目添加到routes.rb文件中。一种方法是在资源块下声明新操作。

resources :quizzs do
   member do
     patch 'check'
   end
end

如果你从shell运行rake routes,你应该会看到一行会有quizzs #check。 Rails不知道rake routes输出中不存在的任何路由。

希望这有助于解决问题并帮助您了解路由的工作原理。

答案 1 :(得分:0)

您的“检查”操作未被路由。低于resources :quizzs添加

patch 'quizzs/check/:id.:format' to: 'quizzs#check' #this names might be different

我希望这能解决你的问题。

PD:您始终可以在终端中使用rake routes来检查您定义的路线及其方法。

GL&amp; HF。