Проверка дочерних объектов, хотя бы одного с заданным значением - PullRequest
1 голос
/ 27 июня 2019

Я реализую функцию, подобную викторине. Каждый тест состоит из нескольких вопросов, каждый вопрос имеет 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

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Основная причина заключается в том, что следующий оператор всегда возвращает false - возможно, потому что объекты еще не сохранены.

self.assessment_options.exists?(is_correct: true)

Чтобы решить эту проблему, мне пришлось изменить has_correct_answer следующим образом:

  def has_correct_answer
    errors.add(:question, "no correct answer") unless self.assessment_options.select { |o| o.is_correct == true}.count > 0
  end

Какая-нибудь лучшая идея / решение?

0 голосов
/ 27 июня 2019

Я недавно столкнулся с этим в приложении Rails 5.2. Кажется, strong_parameters не работает с accepts_nested_attributes_for, как описано в документации здесь: https://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

В моем случае мне пришлось поменять my_model_attributes: [] на my_model: [], поэтому в вашем случае:

def assessment_question_params
  params.require(:assessment_question).permit(
    :id,
    :question,
    :course_id,
    :active,
    { 
      assessment_options: [
        :id,
        :assessment_question_id,
        :answer,
        :is_correct
      ]
    } 
  )
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...