rails无法以“false”值作为属性读取JSON请求

时间:2016-04-19 00:38:12

标签: ruby-on-rails ruby json

好吧,我正在使用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 值。

所以......问题是,我做错了什么?谢谢顺便说一句。

1 个答案:

答案 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?定义)   [...]
  如果要验证是否存在布尔字段(实际值为truefalse),则需要使用validates_inclusion_of :field_name, in: [true, false]

     

这是由于Object#blank?处理布尔值的方式:false.blank? # => true

所以你根本不想要presence: true,你想改用in: [ true, false ]

validate :expiration_points, :in => [ true, false ]