2015-09-20 2 views
1

Я в процессе проверки ответов на приложение для игры, которое я создаю. У меня возникают проблемы с правильным вызовом базы данных.Validating Answers

Вопрос # validate_answer

def validate_answer 
    @answer = Answer.where(correct: true) 
    @correct_answer = @answer 
    @selected_answer = params[:answer] 

    #check if the submitted answer is the correct answer 

    if @selected_answer == @correct_answer 
    render :success 
    else 
    render :error 
    end 
end 

Question.rb

class Question < ActiveRecord::Base 
    belongs_to :category 

    has_many :answers 

    has_one :video_clue 
    has_many :answers 

    def correct_answer 
    answers.find_by correct: true 
    end 
end 

Answer.haml

%form#form{:action => results_path(@question), :method => "post"} 

- @answers.each do |answer| 

.form-group 
.radio 

%input{:name => 'q_id', :type => 'hidden',:value =>'#{@question.id}'} 

%input.btn.btn-default.btn-block{:name => 'answer', :style => 'vertical-align: middle; margin:0px;', :type => 'submit', :value => answer.text} 

Seeds.rb

q = Question.create question: "In what year did MTV (Music Television) premiere and what was the first music video the channel aired?", category_id: 1 
q.answers.create text: '1982 Michael Jackson Bille Jean' 
q.answers.create text: '1984 Madonna Like a virgin' 
q.answers.create text: '1981 The Buggles Video Killed The Radio Star', correct: true 

Целью является сопоставление выбранного ответа с правильным ответом. Он продолжает показывать страницу с ошибкой.

+0

Вы можете получить вопрос в ответ? Сначала вы должны задать свой вопрос в 'validate_answer'. Если вы можете задать вопрос, вы можете изменить свой '@answer = @ question.correct_answer' в' def validate_answer' – akbarbin

+0

Я пробовал это уже и не работал –

ответ

0

Я считаю, что вы сравниваете строку с объектом ActiveRecord, который, конечно, будет терпеть неудачу.

т.е. '1982 Michael Jackson Bille Jean' != <Answer id:1 text:"1982 Michael Jackson Bille Jean">

Рассматривали ли вы передавая идентификатор ответа на вызов вместо текста, а затем сравнить. Это позволит вам запросить ответ, который пользователь выбрал. Например

Вопрос # validate_answer

def validate_answer 
    @answer = Answer.where(correct: true) 
    @correct_answer = @answer 
    @selected_answer = Answer.find(params[:answer_id]) 

#check if the submitted answer is the correct answer 

    if @selected_answer == @correct_answer 
    render :success 
    else 
    render :error 
    end 
end 

Или вам нужно сравнить params[:answer] с текстовым атрибутом

Вопрос # validate_answer

def validate_answer 
    @answer = Answer.where(correct: true) 
    @correct_answer = @answer.text 
    @selected_answer = params[:answer] 

#check if the submitted answer is the correct answer 

    if @selected_answer == @correct_answer 
    render :success 
    else 
    render :error 
    end 
end 
+0

Не повезло. У меня нет параметров answer_id. Когда пользователь выбирает ответ, он должен быть распознан, поэтому я использовал params [: answer]. –

+0

Не уверен, что я понимаю, откуда вы родом, но я обновил альтернативу. вы всегда можете извлечь текстовое значение из ответа. Но если вы отвечаете Answer.where (correct: true), это не повлечет за собой правильные ответы независимо от вопроса? – pyRabbit

+0

Он делает, но, к сожалению, когда я делаю @ answer.text, я получаю сообщение об ошибке, но @answer [0] .text будет работать для первого. –