2015-11-20 3 views
0

Мне сложно получить что-то, что должно быть невероятно простым в работе.Ruby on Rails - если выражение с использованием параметров - неверный результат

У меня есть онлайн-викторина с вопросами с несколькими вариантами выбора и знаком пропуска/отказа. У меня есть все, что работает корректно, запустите функцию проклятых почтовых пользователей в конце. Независимо от того, установлено ли переданное значение true или false, он всегда отправляет отправленное сообщение. Я сделал что-то немного глупое в этом коде, которое я просто не вижу, или мне придется вернуться через все с помощью тонкой зубной гребенки?

def finalize 
    quiztype = params[:quiztype] 
    slug = params[:slug] 
    @qd = Quizdata.where(quiztype: quiztype, usertoken: slug).take 
    if @qd 
     @qd.completed = true 
     quizdata = JSON.parse(@qd.quizdata) 
     quizdata["completed"] = true 
     @qd.quizdata = quizdata.to_json 
     @qd.passed = params[:passed] 
     if @qd.save 
     if params[:passed] 
      QuizMailer.results_email_user(quizdata, @qd).deliver 
     else 
      QuizMailer.results_email_user_failed(quizdata, @qd).deliver 
     end 
     QuizMailer.results_email_client(quizdata, @qd).deliver 
     render json: { errors: [] } 
     else 
     render :json => { :errors => @qd.errors.full_messages }, :status => 422 #Unprocessable entity 
     end 
    else 
     render :json => { :errors => [ "Record not found" ] }, :status => 404 
    end 
    end 
+0

вы можете положить 'ставит params.inspect' выше, если условия, и дайте мне знать выход. – Dusht

+0

I, [2015-11-20T12: 11: 27.109689 # 29542] INFO -: Параметры: {"correct" => "4", "total" => "22", "прошло" => "false" «quiztype» => «mainquiz», «slug» => «MjZlZDA1»} - спасибо за проверку! –

ответ

1

Здесь вы идете:

Заменить

if params[:passed] 

с

if ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.include?(params[:passed]) 

Это был провал, потому что, вы получаете результат в формате String (не ноль, что делает его return true всегда), а не Boolean.

Надеюсь, это поможет!

+0

Спасибо! Я добрался к тому же самому, точно в то же время, что и вы - этот проект был бесконечным - не видел дерева для деревьев. –

+0

@MichaelSmith Вы можете использовать предоставленное мной решение вместо проверки с помощью '==" true "', если вы ожидаете изменений в значениях ': pass'. Этот 'ActiveRecord :: ConnectionAdapters :: Column :: TRUE_VALUES' возвращает' {true, 1, "1", "t", "T", "true", "TRUE", "on", "ON"} ' – Dusht

+0

Это действительно полезно знать. Благодаря! –

0

Параметры передаются как строки.

Должно быть:

if params[:passed] == "true" 
    QuizMailer.results_email_user(quizdata, @qd).deliver 
else 
    QuizMailer.results_email_user_failed(quizdata, @qd).deliver 
end 
Смежные вопросы