Я реализую функцию, подобную викторине. Каждый тест состоит из нескольких вопросов, каждый вопрос имеет 3 возможных ответа.
Мне нужно убедиться, что на каждый вопрос найдется хотя бы один правильный ответ.
Мой код выглядит так:
AssessmentQuestion.rb
(модель)
has_many :assessment_options, inverse_of: :assessment_question, autosave: true
accepts_nested_attributes_for :assessment_options
(...)
validate :has_correct_answer
(...)
def has_correct_answer
errors.add(:question, "no correct answer") unless self.assessment_options.exists?(is_correct: true)
end
К сожалению, эта проверка не работает - она вызывает ошибку («нет правильного ответа», даже если есть assessment_option
с правильным ответом.
Обновление (ответ на вопрос Н.М. Пеннипакера):
AssessmentQuestionsController.rb
def new
params[:course_id].present? ? edited_course : all_courses
@assessment_question = AssessmentQuestion.new
3.times {@assessment_question.assessment_options.build}
end
def create
@assessment_question = AssessmentQuestion.new(assessment_question_params)
if @assessment_question.save
redirect_to course_path(assessment_question_params[:course_id]), notice: 'Assessment question was successfully created.'
else
params[:course_id].present? ? edited_course : all_courses
render :new
end
end
_form.htm.erb
assessment_options
добавляются после
<%= form.fields_for :assessment_options do |ao| %>
Обновление (ответ на вопрос Эмилио Менендеса):
assessment_question_params
def assessment_question_params
params.require(:assessment_question).permit(:id, :question, :course_id, :active,
{ assessment_options_attributes: [:id, :assessment_question_id, :answer, :is_correct] } )
end