0

我有一个 Rails 应用程序,用户在其中创建一个问题(问题模型接受答案模型的嵌套属性)和至少三个答案选择。Answer 模型的属性是 :content (用于问题)和 :correctanswer,一个布尔复选框,供用户检查答案选择是否正确。由于它是一个复选框,因此不幸的是,该表单允许用户选择多个答案为真。我这样做是因为我不知道如何让一个单选按钮与每个答案选项相关联。

为了强制用户仅将一个答案选项标记为正确,我尝试在 Question.rb 模型中创建自定义验证,但在这里你会看到我可怕的 ruby​​ 技能。在下面的代码中,self 是问题,answers 是嵌套模型,而 correctanswer 是嵌套模型的属性。我收到一条错误消息

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

你能告诉我如何实现我想要做的事情吗?我不确定在“if”语句的末尾使用 .size != 1(即是否会计算正确答案的数量并拒绝它?)在“if”语句的末尾,但是,由于正确答案错误首先弹出,我还没有能够看看它是否有效。

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 回答