2017-01-04 4 views
-1

Ich versuche derzeit, eine Ansicht zu erstellen, die eine Frage an den Benutzer zeigt, und wenn sie die Frage richtig beantworten, ermöglicht es dem Benutzer, ein Kontrollkästchen zu aktivieren, das eine Anforderung sendet, das zu erhalten die Datenbank. Mit anderen Worten, wir verfolgen, welche Fragen vom Benutzer in der Datenbank richtig beantwortet wurden. Jetzt ist mein Problem, dass (abgesehen davon, dass ich ein kompletter Neuling in RoR und Front-End im Allgemeinen bin), ich nicht weiß, wie Sie das Kontrollkästchen (Formular) in meiner Ansicht zusammen mit der Frage einfügen. Ich benutze Schienen 4. Danke!Ruby on Rails 4, Formular in einer Ansicht

+0

Sie brauchen wahrscheinlich keine Checkbox als solche, jedes Element wie Schaltfläche wird den Job erledigen ... mit anderen Worten, Sie müssen kein anderes Formularelement oder Formular hinzufügen. Sprechen Sie über Multiple-Choice-Fragen? beantworte deine Frage unten mit einem kleinen Beispiel. – Abhinay

+0

Bitte fügen Sie weitere Details, wie Code-Snippet und Use-Case .. nicht sicher, ob ich in der richtigen Weise denke .. nicht die Dinge hier übernehmen wollen – Abhinay

+0

@Abhinay könnten Sie Recht über den Button ... Nein, es ist nicht ein Multiple-Choice-Frage, nur ein Textfeld für Fragen und wenn der Benutzer möchte, klicken Sie, um die Antwort in einem anderen Textfeld anzuzeigen.Wenn sie die Frage richtig beantwortet haben, möchte ich einen Weg, dies aufzuzeichnen und den booleschen Wert in der Datenbank auf true setzen, um zu wissen, welche Fragen sie richtig beantwortet haben. – Sam

Antwort

0

Ich würde beginnen, einen booleschen Wert zu allen Antworten hinzuzufügen.

$ rails g migration AddCorrectToAnswers 

jetzt sollte, dass die Migration aussehen

class AddCorrectToAnswers < ActiveRecord::Migration[5.0] 
    def change 
    add_column :answers, :correct, :boolean, default: false 
    end 
end 

jetzt können wir eine neue Route erstellen, die die Antworten richtig darstellen wird

# config/routes.rb 

Rails.application.routes.draw do 
    ... 
    resources :questions do 
    resources :answers do 
    match "/correct" => "answers#correct", :as => :correct, via: :all 
    end 
    end 
    ... 
end 

Jetzt sollten Sie eine neue Route

haben
question_answer_correct  /questions/:question_id/answers/:answer_id/correct(.:format) answers#correct 

Ich bin Assumin g, die die Antwort in den Fragen zeigen Seite

jetzt in Ihrer Show-Seite so etwas wie dieses

# app/views/questions/show.html.erb 

<% @question.answers.each do |answer| %> 
    <%= answer.answer %> 
    <%= form_for @user, :url => url_for(:controller => 'answers', :action => 'correct') %> 
    <%= f.label "Correct Answer" %> <br /> 
    <%= f.check_box :correct %> <br /> 
    .... 
    <%end %> 
<% end %> 

nun das letzte, was tun können Sie eine Methode in der Antworten Controller korrekt aufgerufen tun müssen, ist erstellen die Antworten als richtig

# app/controllers/answers_controller.rb 
class AnswersControlle < ApplicationController 
    ... 
    def correct 
    @answer = Answer.find(params[:answer_id]) 
    @answer.correct = true 
    @answer.save 
    redirect_to :back 
    end 
end 

ich markieren hoffen, dass diese

Glücklich Codierung

hilft
+0

Die Antwort auf die obigen Fragen und diese Lösung, Fragen und Antworten sind alle in der gleichen Tabelle. 'Klasse CreateQuizzes Sam

+0

Immer noch daran arbeiten – MZaragoza

0

Angenommen, Sie bereits Formular-Setup haben,

Sie eine Schaltfläche hinzufügen können, die einreichen oder irgendetwas sagt, Sie

<button class="check">Click me</button> 

Jetzt können Sie einen Ereignis-Listener schreiben für diesen Knopf Diplay wollen, die die Antwort offenbaren kann und Wenn es mit der Antwort übereinstimmt, die der Benutzer gegeben hat, dann feuern Sie und Ajax rufen Sie Ihr Backend auf und speichern Sie, was Sie wollen.

Beispielcode:

$('.check').on('click', function(){ 
    var real = $('.reveal-answer').val(); 
    $('.reveal-answer').show(); // you need to protect this part from being abused 
    var answer = $('.user-input-answer').val(); //Assuming its a input field 
var questionId = $('.question').data('question-id'); 
if(answer === real){ 
    url = '/submit_answer'; 
    data = { question_id: questionId, answer: answer }; 
    $.post(url, data , function() { 
    }, 'json'); 
} 
}); 

Grob sollte es so funktionieren, aber es gibt viele Interessenten aus der Sicherheit zu tun. Für Beispiel: Sie können nicht alle Antworten auf der Ansichtsseite haben. Sie sollten die Backend-Validierung durchführen, sobald die Antwort gesendet wurde (um zu überprüfen, ob sie tatsächlich korrekt ist oder jemand versucht hat, sie zu hacken.)

+0

Danach können Sie eine andere Antwort hier für Backend-Materialien geschrieben verwenden. – Abhinay