2011-03-25 80 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