Witam,
Próbuję stworzyć test wielokrotnego wyboru, jednak mam spory problem z zapisem danych z formularza do parametrów.
Otóż taki param, musiałby składać się z tablicy tablic. Tak aby móc zapisać kilka odpowiedzi zaznaczonych przez użytkownika w każdym pytaniu.
Na ten moment wymyśliłem coś takiego:
<% provide(:title, t(:quiz)) %>
<div class="center jumbotron">
<h2><%= t(:quiz) %></h2>
<div>
<%= form_for(:test, url: quiz_path) do |f| %>
<% @quiz.tasks.each_with_index do |task, index| %>
<div class="control-group">
<% @task = Task.find_by(id: task) %>
<%= @task.text %>
<% answers = @task.correct_answers + @task.wrong_answers %>
<% answers.shuffle! %>
<fieldset>
<% answers.each do |answer| %>
<div class="checkbox">
<%= f.check_box("task][#{index}", {class: "checkbox", multiple: true}, answer, nil)%>
<%= f.label "task#{index}", answer %>
</div>
<% end %>
</fieldset>
</div>
<% end %>
<%= f.submit t(:finish_quiz), class: "btn btn-lg btn-primary" %>
<% end %>
</div>
</div>
Wzór paramu utworzony z tego kodu wygląda tak:
params[:test][:task[index]][array z odpowiedziami użytkownika]
Co w praktyce wygląda tak:
params[:test][:task0][10,5,"cebula"]
params[:test][:task1][4,3,-120]
params[:test][:task2]["tak"html","css"]
W kontrolerze potrzebuję porównać czy tablice z odpowiedziami użytkownika pokrywają się z tablicami poprawnych odpowiedzi, a więc posortować je, przyrównać i jeśli się zgadzają to przydzielić punkty.
Problem jest jednak taki, że nie wiem jak za bardzo po tym iterować.
A więc moje pytanie brzmi:
Czy jest jakiś inny lepszy, bardziej elegancki i optymalny sposób na wykonanie takiego czegoś?
Jeśli nie ma to:
Czy aby iterować po tym co ja wytworzyłem, musiałbym użyć metaprogramowania? Jak to zrobić?