Rails: Получить проверенное значение переключателя с помощью html тегов ввода - PullRequest
0 голосов
/ 04 мая 2020

У меня есть простая структура конкурса:

  • В конкурсе есть несколько вопросов
  • Каждый вопрос имеет несколько возможных ответов

Для этого я чувствую Например, то, что я создал, является хорошей структурой: enter image description here

Я пытаюсь получить ответы пользователя на каждый вопрос из формы, на мой взгляд, в мой контроллер. Короче говоря, я был неспособен использовать <%= collection_radio_buttons ... %>, потому что метод не был бы правильным. В моей модели нет ни одного столбца для каждого ответа на каждый вопрос. answer_option - это не столбец в моей таблице вопросов, это ассоциация, потому что это другая таблица ... (или вы знаете, как помочь с этим?)

Так что я обошел эту проблему, создав циклы для answers_options каждый вопрос и использование html входов и меток, например:

<%= simple_form_for @contest, url: contest_send_quizz_path(@contest), method: :post do |f| %>
  <%= f.fields_for :questions do |q| %>
    <% @questions.each do |question| %>
      <h4 class="mt-5"><%= question.title %></h4>
      <% question.answer_options.each do |answer_option| %>
        <div class="inputGroup">
          <input type="radio" name=<%= answer_option.question_id %> value="<%= answer_option.answer %>" id=<%= answer_option.id %> />
          <label for=<%= answer_option.id %>><%= answer_option.answer %></label>
        </div>
      <% end %>
    <% end %>
  <% end %>
  <div class="mt-3">
    <span class="button-effect-2">
        <%= f.button :button, "Envoyer", type: :submit, class:"text-white" %>
    </span>
  </div>
<% end %>

Однако теперь проблема заключается в получении этих значений в контроллере. Кажется, с этим вопросом , что я должен получить его с params[:something] и что :something является именем ввода. Это правильно? И теперь, когда я знаю, что, поставив params[:name] (что одинаково для всех рассматриваемых радиокнопок одного вопроса), непосредственно получаю проверенное радио или есть что-то еще?

Вот что я На данный момент есть вещи, которые нужно игнорировать, так как структура остальной части моего кода больше, чем просто соревнование. Это в ContestsController:

def show
    @contest = Contest.find(params[:id])
    authorize @contest
    @time_left = seconds_to_units(@contest.deadline - Time.now)
    @is_done =  @contest.deadline < Time.now
    if @is_done
      get_winner
    end
    @questions = @contest.questions.includes([:answer_options])
end

def send_quizz
    @contest = Contest.find(params[:contest_id])
    @questions = @contest.questions.includes([:answer_options])
    authorize @contest
    current_user.contests << @contest
    user_choice = # TODO : Get checked radio value from view
    user_contest = current_user.contests.select { |contest| contest.title == @contest.title }.first
    user_contest.questions.each do |question|
      question.user_answer = user_choice
    end
    # TODO : make sure every questions were answered before submitting request
    redirect_to contests_path
    flash[:notice] = "Ta réponse a été prise en compte"
end

Так есть ли способ получить это значение, или я должен изменить свою структуру БД, чтобы у каждого вопроса был один столбец для каждого ответа? Или, может быть, другое решение? Спасибо!


РЕДАКТИРОВАТЬ:

Я также попытался заменить это:

<input type="radio" name="<%= answer_option.question_id %>" value="<%= answer_option.answer %>" id="<%= answer_option.id %>" />
<label for="<%= answer_option.id %>"><%= answer_option.answer %></label>

На это:

<%= q.check_box :answer_option, name:answer_option.question_id, id:answer_option.id %>
<%= q.label :answer_option, answer_option.answer, for:answer_option.id %>

И получая значение в контроллере с user_choice = params[:answer_option], но когда я заменил check_box на radio_button, он испортил имя, id et c. значения И я больше не могу выбирать.


РЕДАКТИРОВАТЬ 2:

Добавив эту структуру:

<%= q.radio_button :answer_option, answer_option.answer %>
<%= q.label :answer_option, answer_option.answer %>

Работает ( ошибок нет), однако имя задается автоматически и что-то не определено c для каждого вопроса, т.е. contest[questions][answer_option], а метка для установлена ​​на contest_questions_answer_option, поэтому нажатие на метку не ссылается на флажок.

1 Ответ

0 голосов
/ 05 мая 2020

удалось получить значение флажка с этой структурой для переключателей:

<%= q.radio_button answer_option.question_id, answer_option.answer %>
<%= q.label "#{answer_option.question_id}_#{answer_option.answer.parameterize.underscore}", answer_option.answer %>

и контроллера:

user_choices = params[:contest][:questions]
user_contest.questions.each do |question|
  question[:user_answer] = "#{user_choices[:'#{question.id}']}"
  question.save
end
...