У меня есть простая структура конкурса:
- В конкурсе есть несколько вопросов
- Каждый вопрос имеет несколько возможных ответов
Для этого я чувствую Например, то, что я создал, является хорошей структурой: ![enter image description here](https://i.stack.imgur.com/lnHHd.png)
Я пытаюсь получить ответы пользователя на каждый вопрос из формы, на мой взгляд, в мой контроллер. Короче говоря, я был неспособен использовать <%= 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
, поэтому нажатие на метку не ссылается на флажок.