Rails嵌套表单忽略验证条件

时间:2014-02-09 13:47:46

标签: ruby-on-rails validation nested-forms

我有这个简单的设置:帐户#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上。渲染嵌套表单时,它会尝试创建一个新表单而不是更新现有表单。

2 个答案:

答案 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。集合关联会忽略该选项。

就是这样。