0

ユーザーが質問を作成し(質問モデルは回答モデルのネストされた属性を受け入れる)、少なくとも3つの回答の選択肢があるRailsアプリがあります。Answerモデルの属性は、:content(質問用)と:correctanswerであり、ユーザーが回答の選択が正しいかどうかを確認するためのブールチェックボックスです。これはチェックボックスであるため、残念ながら、このフォームではユーザーが複数の回答をtrueとして選択できます。各回答の選択肢に1つのラジオボタンを関連付ける方法がわからなかったため、この方法で行いました。

ユーザーに1つの回答の選択肢のみを正解としてマークするように強制するために、Question.rbモデルでカスタム検証を作成しようとしましたが、ここに私の恐ろしいルビースキルが表示されます。以下のコードでは、selfが質問、answersがネストされたモデル、correctanswerがネストされたモデルの属性です。エラーメッセージが表示されます

undefined method `correctanswer' for []:ActiveRecord::Relation

私がやろうとしていることを達成する方法を教えてください。'if'ステートメントの最後に使用するかどうか .size != 1(つまり、正解の数をカウントして拒否するかどうか)はわかりませんが、正解エラーが最初に表示されたため、まだ使用していません。それが機能するかどうかを確認できます。

validate :only_one_checked_box

  def only_one_checked_box
     if self.answers.correctanswer.reject(&:marked_for_destruction?).size != 1

      self.errors[:base] << "Must mark one and only answer as correct"
    end

  end 
4

2 に答える 2

2

Answerモデルが表示されないため、ここでは多少推測していますが、次のことを実行したいと考えています。

def only_one_checked_box
  if self.answers.select{|a| a.correctanswer == true}.size !=1
    self.errors[:base] << "Must mark one and only answer as correct"
  end
end
于 2013-03-01T22:33:10.463 に答える
1

self.answersは回答の配列であるため、繰り返して、回答が正解としてマークされているかどうかを確認する必要があります。これを行う簡単な方法は次のとおりです。

def only_one_checked_box
  correct = 0
  self.answers.each { |a| correct += 1 if a.correctanswer }

  if correct != 1
    self.errors[:base] << "Must mark one and only answer as correct"
  end
end 
于 2013-03-01T22:29:50.040 に答える