Определить правильный ответ из списка <li>? - PullRequest
0 голосов
/ 24 марта 2019

У меня есть questions, у которого есть пять choices, из которых один ИСТИНА для choices.is_correct.

В настоящее время у меня есть цикл ERB, отображающий вопрос и возможные варианты ответов, с вариантами, рандомизированными в упорядоченном порядке.list (<li>).

В отдельном цикле ERB мне нужно отобразить правильный ответ в виде соответствующей метки <li> (A, B, C, D или E).

Я чувствую, что это может быть возможно через какую-то локальную переменную, но ни один из моих тестов пока не работает.Должны ли работать локальные переменные, или я подхожу с неправильной перспективы?

Мой текущий ERB для раздела вопрос / ответ:

      <%  @free_questions.each_with_index do |question, i| %>
        <div class="row justify-content-center">
          <div class="col-lg-10">
            <% @a = ("a".."z").to_a %>
            <h5>Question <%= i+1 %>: <%= question.name %></h5>
            <p>
            <ol type="A">
              <%  @free_choices.where(question: question.id).sort_by{rand}.each do |choice| %>
                <li><%= choice.name %></li>
              <% end %><br />
            </ol>
            </p>
            <%  @free_choices.where(question: question.id, correct: TRUE).each do |choice| %>
              <div class="accordion" id="accordionExample">

                <%  if choice.question.context.present? or choice.question.image.attached? %>
                  <div class="card">
                    <div class="card-header" id="headingC<%= i+1 %>">
                      <h5 class="mb-0">
                        <button class="btn btn-link" type="button" data-toggle="collapse" data-target="#collapseC<%= i+1 %>" aria-expanded="true" aria-controls="collapseC<%= i+1 %>">
                          CLICK FOR QUESTION CONTEXT
                        </button>
                      </h5>
                    </div>
                    <div id="collapseC<%= i+1 %>" class="collapse" aria-labelledby="headingC<%= i+1 %>" data-parent="#accordionExample">
                      <div class="card-body">
                        <p>
                          <%  if choice.question.image.attached? %>
                            <img src="<%= url_for(choice.question.image) if choice.question.image.attached? %>" class="rounded float-center" alt="context image for this question">
                          <% end %>
                          <!--TODO: Add more useful image alts here-->
                          <%= simple_format(choice.question.context) %>
                        </p>
                      </div>
                    </div>
                  </div>
                <% end %>    

                <div class="card">
                  <div class="card-header" id="headingA<%= i+1 %>">
                    <h5 class="mb-0">
                      <button class="btn btn-link" type="button" data-toggle="collapse" data-target="#collapseA<%= i+1 %>" aria-expanded="true" aria-controls="collapseA<%= i+1 %>">
                        CLICK FOR ANSWER
                      </button>
                    </h5>
                  </div>
                  <div id="collapseA<%= i+1 %>" class="collapse" aria-labelledby="headingA<%= i+1 %>" data-parent="#accordionExample">
                    <div class="card-body">
                      <p>
                        Correct Answer: <b><%= choice.name %></b>
                      </p>
                      <p>
                        Explanation: <%= raw(choice.question.explanation) %>
                      </p>
                    </div>
                  </div>
                </div>
              </div>
            <% end %>
            <hr />
          </div>
        </div>
      <% end %>

РЕДАКТИРОВАТЬ: Добавление моделей ниже

question.rb

class Question < ApplicationRecord
  before_validation :assign_questionable
  belongs_to :questionable, polymorphic: true
  has_many :choices, :dependent => :destroy
  accepts_nested_attributes_for :choices, allow_destroy: true

choice.rb

class Choice < ApplicationRecord
  belongs_to :question

1 Ответ

1 голос
/ 24 марта 2019

Здесь я обрисовываю в общих чертах быстрое исправление

  1. заменить <% @a = ("a".."z").to_a %> на <% alpha_numbers = ("A".."Z").to_a %>. Вы используете <ol type="A">, который печатает список в верхнем регистре, а не в маленьком.
  2. Перемещение над фрагментом вне цикла @free_questions.each_with_index, чтобы вы не заканчивали инициализацию одного и того же массива для каждого вопроса в цикле.
  3. Заменить @free_choices.where(question: question.id).sort_by{rand}.each do |choice| на question.choices.shuffle.each_with_index do |choice, index|. Согласно модельным отношениям, question.choices даст тот же результат, что и @free_choices.where(question: question.id). shuffle лучший способ сделать sort_by{rand}.
  4. В модели Choice добавьте attr_accessor :alpha_order. Это создаст методы доступа.
  5. Выше <li><%= choice.name %></li> строки добавить <% choice.alpha_order = alpha_numbers[index] %>. Эта строка устанавливает текущий алфавитный порядок выбора в переменной экземпляра.
  6. Заменить @free_choices.where(question: question.id, correct: TRUE).each do |choice| на question.choices.select { |choice| choice.is_correct }.each do. Это перебирает только те варианты выбора для question, где is_correct равно true.
  7. Если вы хотите, чтобы алфавитный номер был прикреплен к выбору, получите к нему доступ с помощью choice.alpha_order, который даст правильный альфа-порядок.

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

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