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