views:

93

answers:

2

I'm trying to grade a quiz application I would like to make. I have a questions model with and ask(the actual question), 4 choices(a-d), and a correct answer(string).

In the view I have the 4 question being diplayed then the correct answer choice (This is just a test for functionality) and then I created a text_field to accept the users answer choice and a button to refresh the index action which has the scoring logic, for now..

--Do I need to put the text_field within a form_tag?

<p>1. <%= h @question.q1  %></p>
<p>2. <%= h @question.q2  %></p>
<p>3. <%= h @question.q3  %></p>
<p>4. <%= h @question.q4  %></p>
<p>Answer: <%= h @question.correct  %></p>
<%= text_field_tag :choice, params[:choice] %> 
<%= button_to "Grade", {:controller => 'site', :action => "index"}  %> 
<p> <%= @answer %></p>

Heres the index controller action

def index 
      @question = Question.find(1) 
         if @question.correct == params[:choice]
             @answer = 'right'
         else
                @answer = 'wrong'
         end
end

Its not really working. The textfield is supposed to take a letter choice like 'a' or 'c' and compare it with the correct answer in the database.

I would love this to work by radiobuttons, but I'm a newbie to rails so I thought I'd take baby steps.

So if anyone can help me with how to fix this by string, or preferably by radiobuttons, I'd really appreciate it.

A: 

At the moment your code will ignore the text entered. User input needs to be either posted (via a form & submit button) or via a get (can also be done with a form).

In this case, I'd suggest you put it in the form tag and add a submit button. Add the necessary action to your controller (save I believe in this case), validate the data, and then render the index action.

Matt S
+1  A: 

Here's how I would do it:

# in app/controller/QuestionsController
def index 
  @question = Question.find(1) 
  @grade = params[:choice] == @question.answer ? 'PASS' : 'FAIL'
end

It will require a named route in your config/routes.rb file:

map.questions 'questions', :controller => 'questions', :action => 'index'

and then, in app/views/index.html.erb:

<h2><%=h @question.question_text %></h2>

<ol>
  <li><%=h @question.q1 %></li>
  <li><%=h @question.q2 %></li>
  <li><%=h @question.q3 %></li>
  <li><%=h @question.q4 %></li>
</ol>

<p>
  Correct answer <%=h @question.correct %>
</p>

<% form_tag do %>
  <p>Choice? <%= text_field_tag :choice %></p>
  <%= submit_tag 'Grade' %>
<% end %>

<p>Grade: <%= @grade %></p>

I could give you much more specific assistance if you'd provide your routes.rb file as well as the rest of your controller code. The above answer is not RESTful at all. If that is at all important to you, the routes configuration would be different, as well as the controller code. Also, with RESTful design, you could use a form_for method call in your view, which is more standard these days.

irkenInvader