Вы можете использовать radio_button_tag
и передать ему свой собственный атрибут имени.
Поскольку вы все еще находитесь в области действия choice_fields
, у вас есть доступ к нескольким методам, которые могут раскрыть объект, с которым вы работаетеon, что поможет вам правильно назвать ваше radio_button_tag
.
Следующий код даст вашему переключателю правильное имя, которое будет принято как вложенный атрибут:
<%= radio_button_tag "question[choices_attributes][#{choice_fields.index}][correct]", true, choice_fields.object.correct %>
choice_fields.index
дает вам доступ к правильному индексу создаваемого ресурса, поэтому первая копия будет иметь имя question[choices_attributes][0][correct]
, вторая question[choices_attributes][1][correct]
и т. Д.
choice_fields.object.correct
даетВы получаете доступ к текущему значению, поэтому правильные переключатели будут заполнены для редактирования форм.
Обновление: Решение, приведенное выше, на самом деле неверно, оно дает каждому переключателю различные name
атрибут, чтобы они не работали вместе (вы можете выбрать несколько переключателей одновременно).
Решение, с которым я закончил, было в следующих строках:
<%= radio_button_tag "question[choices_attributes][correct_choice]", choice_fields.index, choice_fields.object.correct %>
Thisдает каждому переключателюТо же имя, что и у других, и значение, равное индексу правильного выбора.Хэш параметров в итоге выглядит следующим образом:
question: {choices_attributes: {
"0": {//choice 0},
"1": {//choice 1},
etc...
},
correct_choice: //index of correct answer
}
Затем я обновил свой контроллер, чтобы вручную обновить правильный выбор следующим образом:
def create
# Find the index of the correct choice in the params hash
correct_index = params[:question][:correct_choice]
# mark the question at the correct index as correct
params[:question][:choiceses_attributes][correct_index][:correct] = true
# Use the updated params hash to create a new Question/update an existing Question
@question = Question.new(params[:question])
# render or redirect stuff....
end