rails 表示嵌套模型的字段在不存在时为空的问题

Issue with rails saying a nested model's field is blank when it is not

我在获取经过验证的嵌套模型以正确保存时遇到问题。这似乎只发生在这个模型中的一个字段上。

我有两个模特,一个是兽医

class Veterinarian < ApplicationRecord
  has_many :licenses
  accepts_nested_attributes_for :licenses, allow_destroy: true, reject_if: :all_blank
end

和许可证

class License < ApplicationRecord
  belongs_to :veterinarian
  validates :number, :expiration_date, presence: true
end

我的控制器操作除了用 vet_params 调用 Veterinarian.create(vet_params) 外什么都不做,看起来像这样呈现为 JSON。

{  
  "zip_code":"",
  "title":"",
  "bio":"",
  "photo":"",
  "licenses_attributes":{  
    "0":{  
      "number":"6436436446",
      "expiration_date":"09/06/2018",
      "_destroy":"false"
    },
    "1":{  
      "number":"Test Number",
      "expiration_date":"09/16/2020",
      "_destroy":"false"
    },
    "2":{  
      "number":"test 2",
      "expiration_date":"09/30/2016",
      "_destroy":"false"
    }
  }
}

正确的参数被发送到 'create()',但是对于嵌套的许可证,它总是抛出一个错误,说 expiration_date 不能为空。这只会发生在第一个许可证之后的其他许可证上。第一个验证得很好。

我不知道是什么原因造成的。我以前从未见过这种情况。任何想法将不胜感激。

这是 Rails 5 顺便说一句。

您的到期日期无效。

"1":{  
  "number":"Test Number",
  "expiration_date":"09/16/2020",
  "_destroy":"false"
},

在rails控制台尝试,

date = Date.parse("09/16/2020")

你会得到错误

ArgumentError: invalid date
from (irb):20:in `parse'
from (irb):20

但是在保存记录时,rails 跳过了这个错误并且 expiration_date 被设置为 nil,并且随后的验证引发了错误,指出过期日期不能为空。

validates :number, :expiration_date, presence: true

将到期日期从“09/16/2020”更改为“09/09/2020”。您的代码可以正常工作。