如何使用 Rails 验证来允许和属性变量是两个值之一?

问题描述

对于一个项目,我需要 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...