Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 模型属性是活动记录关系的未定义方法_Ruby On Rails_Rails Activerecord - Fatal编程技术网

Ruby on rails 模型属性是活动记录关系的未定义方法

Ruby on rails 模型属性是活动记录关系的未定义方法,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我有一个Rails应用程序,其中用户创建一个问题(问题模型接受答案模型的嵌套属性)和至少三个答案选择。答案模型上的属性是:content(用于问题)和:correctanswer,这是一个布尔复选框,用于用户检查答案选择是否正确。因为它是一个复选框,所以表单允许用户选择多个答案为true。我这样做是因为我不知道如何将一个单选按钮与每个答案选项关联起来 为了强制用户只将一个答案选项标记为正确,我尝试在Question.rb模型中创建一个自定义验证,但这就是我可怕的ruby技能。在下面的代码中,se

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

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

undefined method `correctanswer' for []:ActiveRecord::Relation
你能告诉我如何实现我的目标吗?我不确定是否使用
.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 
验证:仅选中一个复选框
仅定义一个复选框
if self.answers.correctanswer.reject(&:标记了_用于_销毁?).size!=1.

self.errors[:base]
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 
仅定义一个复选框
正确=0
self.answers.each{a | correct+=1如果a.correctanswer}
如果正确!=1.

self.errors[:base]
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 
仅定义一个复选框
正确=0
self.answers.each{a | correct+=1如果a.correctanswer}
如果正确!=1.

self.errors[:base]我在这里有些猜测,因为我看不到您的答案模型,但我怀疑您希望执行以下操作:

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
仅定义一个复选框
如果self.answers.select{| a | a.correctanswer==true}.size=1.

self.errors[:base]我在这里有些猜测,因为我看不到您的答案模型,但我怀疑您希望执行以下操作:

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
仅定义一个复选框
如果self.answers.select{| a | a.correctanswer==true}.size=1.

self.errors[:base]为什么不使用单选按钮而不是复选框?您可以对它们进行分组,它们只允许用户选择一个选项。更多信息:“名称”属性将单选按钮组合在一起,并且只能选择其中一个为什么不使用单选按钮而不是复选框?您可以对它们进行分组,它们只允许用户选择一个选项。更多信息:“name”属性将单选按钮组合在一起,并且只能选择其中一个。由于@kaeros喜欢您的代码,我将接受您的答案作为最佳答案。两个人都帮助了我。非常感谢,谢谢你们两位。很高兴它很有帮助,因为@kaeros喜欢你的代码,我会接受你的答案作为最好的答案。两个人都帮助了我。非常感谢,谢谢你们两位。很高兴它对我有帮助即使你先回答,你的答案对我有帮助,我还是选择了博尔德作为正确答案,因为你更喜欢它即使你先回答,你的答案对我有帮助,我还是选择博尔德作为正确答案,因为你更喜欢它