2011-03-25 83 views
21

validates :presencevalidates_presence_of有什么区别?通过ActiveModel看,他们看起来像他们设置验证相同的方式。不过,考虑到下面的模型定义:Rails 3:验证:presence => true vs validates_presence_of

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它会。

回答

21

所有那些validates_whatever_of :attr宏都叫validates :attr, :whatever => true

问题是您使用validate而不是validates

+1

感谢。我现在觉得很愚蠢。 – 2011-03-25 19:23:12

+1

我可以加入你:) – 2012-01-26 02:25:22

+1

但是为什么像'Agile Web Development with Rails'这样的书中没有提到验证的validates_whatever_of方法,所有的验证示例都是使用'validates:attr,:whatever => true'完成的? – Ansd 2012-04-18 01:33:00

18

在Rails 3.x和4.x - 它现在鼓励使用的语法如下:

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

取而代之的2.X方式:

validates_presence_of :email 
validates_presence_of :password 
+0

值得注意的是(作为上面的@mlibby做的)Rails2'validates_ *'更高效,因为他们立即用适当的验证器调用validates_with'而不是解析参数并尝试不同的验证器。使用[Rails3 +方式]比较[Rails2方式](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/presence.rb#L34-L36)(https:// github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/validates.rb#L104-L125)。 – Dennis 2014-11-10 14:08:57

0

事实上只会验证和validates_presence_of并不完全相同!

validates_presence_of允许你也懒洋洋地检查字段中的值是否包含在另一个表中。

就像是:

validates_presence_of :pay_type, :inclusion => PaymentType.names 

这是什么原因包含只计算第一次你不能用类似的东西

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

做的那样容易(不是在偷懒的方法)

0

我原以为在想要包含其他验证如:foo如长度或uniq时使用validates :foo presence: true是合适的ueness。但是如果你知道你需要的唯一验证属性是存在,那么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