資料驗證


Rails提供應用層資料庫存取模型的驗證,舉例來說,如果在真正儲存至資料庫前,想驗證name欄位有無資料,可以如下:

class Message < ActiveRecord::Base
    validates :name, :presence => true
end

以上驗證Message是否設定了name欄位,不過使用new方法並不會觸發驗證,會觸發驗證的方法是那些會對資料庫進行INSERT或UPDATE的方法:

  • create
  • create!
  • save
  • save!
  • update
  • update_attributes
  • update_attributes!

例如:

> message = Message.new(:content => "Justin's messages")
> message.save!
ActiveRecord::RecordInvalid: Validation failed: Name can't be blan
略...

可以使用valid?或invalid?得知欄位是否符合驗證。例如:

> message = Message.new(:content => "Justin's messages")
> message.valid?
=> false
> message = Message.new(:name => "Justin", :content => "Justin's messages")
> message.valid?
=> true

不會觸發驗證的方法有:

  • decrement!
  • decrement_counter
  • increment!
  • increment_counter
  • toggle!
  • touch
  • update_all
  • update_attribute
  • update_column
  • update_counters

save或save!方法在呼叫時若傳入:validate => false,也是會避開驗證程序。

如果有多個欄位要驗證,可以分開撰寫多個validates,或者是寫為一行:

validates :name, :content, :presense => true

validates搭配選項:xxx進行驗證,通常也會有個validates_xxx_of的簡便輔助方法。例如上例可以寫為:

validates_presence_of :name, :content

除了使用:presense驗證該欄位是否有資料,還可以使用的選項有:

  • :acceptance
確認使用者是否核取方塊,例如:
validates :terms_of_service, :acceptance => true

上例等同於:
validates_acceptance_of :terms_of_service

資料庫模型或資料表中不一定要有terms_of_service這個欄位,如果沒有,會為模型建立一個虛擬欄位以進行驗證。可以加上:accept指定接受時的值,預設是1。例如:
validates :terms_of_service, :acceptance => { :accept => "yes" }