我有这个简单的设置:帐户#has_one
类的所有者。
现在,帐户创建和更新的表单使用了人员属性的嵌套表单 - 例如姓名,电子邮件和密码。
这些属性有验证 - 密码需要确认,电子邮件不能为空等等。
但是某些验证的条件是使用:if
。
例如,如果password_digest
属性为空,我只需要输入密码,所以:
validates_presence_of :password, :if => :requires_password?
def requires_password?
password_digest.blank?
end
事情是:它绕过条件,就像完全忽略它一样,但是当使用上面提到的嵌套形式时,只。
如果我使用直接表单对其运行的Person类进行测试,则验证会考虑其条件。
发生了什么事?
我正在使用Rails 4.1.0.beta1。
更新。刚刚发现它与验证无关,但事实是它只发生在#update上。渲染嵌套表单时,它会尝试创建一个新表单而不是更新现有表单。
答案 0 :(得分:0)
这是ActiveRecord中has_one关系的默认行为。您应该将validate: true
属性和值添加到has_one
关系
class Account < ActiveRecord::Base
has_one :owner, class_name: 'Person', validate: true, unless: :password_digest?
end
查看http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one。
答案 1 :(得分:0)
发现问题。来自Rails API:
<强>:update_only 强>
对于一对一关联,此选项允许您指定在关联记录已存在时如何使用嵌套属性。通常,现有记录可以使用新的属性值集更新,也可以由包含这些值的全新记录替换。默认情况下,:update_only选项为false,嵌套属性仅在包含记录的:id值时才用于更新现有记录。否则,将实例化新记录并用于替换现有记录。但是,如果:update_only选项为true,则嵌套属性将始终用于更新记录的属性,无论是否存在:id。集合关联会忽略该选项。
就是这样。