Rails 3:验证:presence => true vs validates_presence_of

时间:2011-03-25 19:04:09

标签: ruby-on-rails-3

validates :presencevalidates_presence_of之间有什么区别?通过ActiveModel查看,看起来他们以相同的方式设置验证。但是,给定以下模型定义:

class Account < ActiveRecord::Base
  has_one :owner_permission, :class_name => 'AccountPermission', :conditions => { :owner => true, :admin => true }
  has_one :owner, :class_name => 'User', :through => :owner_permission, :source => :user

  validate :owner, :presence => true
  validates_associated :owner
end

Account的实例上调用保存不会验证所有者的存在。但是,如果我使用validates_presence_of,它会。

4 个答案:

答案 0 :(得分:24)

所有这些validates_whatever_of :attr宏都会调用validates :attr, :whatever => true

问题是您使用的是validate而不是validates

答案 1 :(得分:21)

在Rails 3.x和4.x中 - 现在鼓励使用以下语法:

validates :email, presence: true
validates :password, presence: true

而不是2.x方式:

validates_presence_of :email
validates_presence_of :password

答案 2 :(得分:0)

实际上,validates和validates_presence_of并不完全相同!

validates_presence_of允许您通过示例懒惰地检查字段中的值是否包含在另一个表中。

就像那样:

validates_presence_of :pay_type, :inclusion => PaymentType.names

使用类似的东西,你不能轻易做到这一点

validates :pay_type, presence, :inclusion => PaymentType.names

因为仅在第一次评估包含时(不是以懒惰的方式)

答案 3 :(得分:0)

如果您想要包含validates :foo presence: true的其他验证,例如长度或唯一性,我认为使用:foo是合适的。但是,如果您知道属性所需的唯一验证是在线状态,则validates_presence_of似乎更有效。

所以:

validates :foo, length: {maximum: 50}, uniqueness: true, 
                format: {with: /bar/}, 
                presence: true # lots of validations needed

可是:

validates_presence_of :foo # only presence validation needed