问题描述
对于一个项目,我需要 Post 类的类别属性为“小说”或“非小说”。我尝试了以下语法...
class CategoryValidator < ActiveModel::Validator
def validate(record)
unless (record.category == "Fiction" || "Non-Fiction")
record.errors[:category] << "Must be valid category"
binding.pry
end
end
end
但它从来没有碰到 binding.pry 行,这意味着它从来没有碰到“直到”块,即使我故意输入错误的答案。 #validate 方法的正确语法是什么?
解决方法
您检查类别是 'Fiction'
还是 'Non-Fiction'
的条件不正确。
(record.category == "Fiction" || "Non-Fiction")
被评估为 (record.category == "Fiction") || "Non-Fiction"
,因为 ==
的优先级高于 ||
。因此,表达式将始终返回 "Non-Fiction"
,这是真的。这就是为什么即使类别不“有效”,您的代码也从未到达 binding.pry
行的原因。
def validate(record)
unless %w(Fiction Non-Fiction).include?(record.category)
record.errors[:category] << "Must be valid category"
end
end
自定义验证器对于这个用例来说是一种矫枉过正。您可以使用 inclusion
添加此验证。
validates :category,inclusion: {
in: %w(Fiction Non-Fiction),message: 'must be either Fiction or Non-Fiction'
}
,
我讨厌自己,这么简单的修复我就搞定了
class CategoryValidator < ActiveModel::Validator
def validate(record)
unless (record.category == "Fiction" || record.category == "Non-Fiction")
record.errors[:category] << "Must be valid category"
end
end
end