我有一个Rails应用程序,其中用户创建一个问题(问题模型接受答案模型的嵌套属性)和至少三个答案选项。 Answer模型的属性是:content(对于问题)和:correctanswer,一个布尔复选框,供用户检查答案选择是否正确。由于它是一个复选框,因此表单允许用户选择多个答案为true。我是这样做的,因为我无法弄清楚如何将一个单选按钮与每个答案选项相关联。
为了强制用户仅将一个答案选项标记为正确,我尝试在Question.rb模型中创建自定义验证,但这是您将看到我可怕的红宝石技能的地方。在下面的代码中,self是问题,答案是嵌套模型,而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
答案 0 :(得分:2)
我在这里猜测是因为我看不到你的答案模型,但我怀疑你想要做以下事情:
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
答案 1 :(得分: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