我遇到了一个问题,即在验证时让嵌套模型正确保存。这似乎只发生在这个模型中的单个字段中。
我有两个模特,一个兽医
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
我的控制器操作除了使用Veterinarian.create(vet_params)
调用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"
}
}
}
正确的params被发送到'create()'但是使用嵌套许可证时它会一直抛出错误,说expiration_date不能为空。只有在第一个许可证之后的其他许可证才会发生这种情况。第一个验证就好了。
我对导致这种情况的原因感到茫然。我以前从未见过这种情况。任何想法都将不胜感激。
这是Rails 5顺便说一句。
答案 0 :(得分:1)
您的失效日期无效。
"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”。您的代码可以正常工作。