Поиск маршрута рендеринга в случае сбоя проверки в Rails - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь создать базовый инструмент для опросов c в качестве моего первого проекта на Rails. В данный момент я работаю над проверкой для предоставления нового ответа на вопрос опроса. Ниже моя модель ответа.

class Answer < ApplicationRecord
  belongs_to :question
  belongs_to :participant
  validates :text, presence: true,
            length: { minimum: 5, maximum: 100 }
end

Я настроил оператор if, который приведет вас к следующему вопросу, если проверка прошла успешно. Моя проблема в том, что я не уверен, что нужно сделать в остальном для этого утверждения.

Для аналогичной проверки в других контроллерах я написал оператор render как URL страниц. Например: Просмотреть все вопросы + добавить новый вопрос отображаются на странице исследований / идентификатора. Таким образом, если проверка вопроса не удалась, то рендерингом будет «исследование / шоу».

URL-адрес для добавления нового ответа выглядит следующим образом. http://localhost:3000/studies/20/questions/47/answers/new

Для большего контекста вот мой код:

*Answers Controller*

class AnswersController < ApplicationController
  def new
    @study = Study.find(params[:study_id])
    @question = @study.questions.find(params[:question_id])
    @participant = find_participant
    @answer = @question.answers.build(participant: @participant)
  end

  def create
    @study = Study.find(params[:study_id])
    @question = @study.questions.find(params[:question_id])
    @answer = @question.answers.build(answer_params)

    if @answer.save
      next_question = @question.next_question
      redirect_to next_question_path(next_question, @answer) if next_question.present?

    else
      #I want to render the current page the participant is on to display errors here.
    end
  end  

  ***some private functions here***

end

* New Answer View *
<div class="wrap">
  <h1 class="med-header"><%= @question.question %></h1>

  <%= form_with model: @answer, url: study_question_answers_path(@study, @question), local: true do |form| %>
    <%= form.hidden_field :participant_id %>

    <% @question.answers.each do |answer| %>
        <% if answer.errors.any? %>
          <div id="error_explanation">
            <h2>
              <%= pluralize(answer.errors.count, "error") %> prohibited
              this answer from being saved:
            </h2>
            <ul>
              <% answer.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
              <% end %>
            </ul>
          </div>
        <% end %>
      <% end %>

    <%= form.text_area :text %><br>
    <%= form.submit %>
  <% end %>
</div>

Что я могу сделать в другом?

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

create генерирует объект и сохраняет. new только генерирует объект. Если в этой ситуации произойдет сбой @answer.save, то

  • нам нужно показать форму обратно пользователю. format.html { render :new }
  • Если используется JSON, вам нужно показать ошибки format.json { render json: @anwser.errors, status: :unprocessable_entity }

Ссылка: Как работает CURD

0 голосов
/ 20 февраля 2020

Дешевый способ сделать это:

   if @answer.save
      next_question = @question.next_question
      redirect_to next_question_path(next_question, @answer) if next_question.present?
    else
      flash[:notice] = @answer.errors.full_messages.first 
      render :new 
    end

render :new отобразит представление new так, как вы можете сделать вывод.

Неожиданно ваш next_question_path(next_question, @answer) if next_question.present? является незапертыми воротами если нет next_question:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...