好吧,我正在使用rails 4.2.6和ruby 2.3.0构建RESTfull API。 我有一个:程序资源,每当我尝试通过 Google Postman 发出POST请求时,我都会收到“不能为空”错误。 等等,让我说明......
当我通过邮递员发送时:
{
"program": {
"expiration_points": "false"
}
}
我回来了:
{
"errors": {
"expiration_points": [
"can't be blank"
]
}
}
我已经尝试过:“false”,“false”,false和:false。
但是,当我为 expiration_points 设置“true”或true值时,它的工作正常。
请记住,我已在迁移时为 expiration_points 属性定义了默认值:false 值。
所以......问题是,我做错了什么?谢谢顺便说一句。
答案 0 :(得分:4)
所以你在模型中有这个:
validates :expiration_points, presence: true
那么presence: true
做了什么?我们可以查看validates
documentation,但只是说:
此方法是所有默认验证器和以“Validator”结尾的任何自定义验证程序类的快捷方式。请注意,通过在其位置创建自定义验证程序类(如PresenceValidator),可以在特定类中覆盖Rails默认验证程序。 [...]
但这只是给了我们一些例子并告诉我们某些选项的作用。您可以查找PresenceValidator
文档,但没有这样的事情。
如果你已经使用Rails一段时间,你就会知道
validate :f, :presence => true
在功能上等同于:
validates_presence_of :f
且validates_presence_of
documentation仍然存在:
验证指定的属性不是空白(由
Object#blank?
定义) [...]
如果要验证是否存在布尔字段(实际值为true
和false
),则需要使用validates_inclusion_of :field_name, in: [true, false]
。这是由于
Object#blank?
处理布尔值的方式:false.blank? # => true
。
所以你根本不想要presence: true
,你想改用in: [ true, false ]
:
validate :expiration_points, :in => [ true, false ]