跳轉到內容

Ruby on Rails/ActiveRecord/Validations

來自 Wikibooks,開放世界中的開放書籍

ActiveRecord 支援各種模型驗證方法,並允許根據需要新增新方法。

一般用法

[編輯 | 編輯原始碼]

有關所有驗證的完整參考,請檢視官方指南API 文件

此外,您可以使用以下方法將驗證應用於一個或多個屬性:validate_each指令

  class Person < ActiveRecord::Base
    validates_each :first_name, :last_name do |record, attr, value|
      record.errors.add attr, 'starts with z.' if value[0] == ?z
    end
  end

也可以透過自定義方法或塊定義驗證

  • validate
  • validate_on_create
  • validate_on_update

例如

    class Person < ActiveRecord::Base
      validate :validate_email

      def validate_email
        record.errors.add :email, 'Invalid email' unless email =~ /@/
      end
    end

通常,驗證發生在每次建立或儲存記錄時,但是您可以使用以下方法強制驗證*不*發生:save_with_validation方法傳遞@false@作為引數。

重要驗證器

[編輯 | 編輯原始碼]

validates_acceptance_of

[編輯 | 編輯原始碼]
validates_acceptance_of :play_rules

如果您需要檢查使用者是否設定或“接受”了某個複選框,可以使用此驗證。在這種情況下,具有 HTML 屬性“name='play_rules'”的複選框需要被選中才能透過驗證。

validates_confirmation_of

[編輯 | 編輯原始碼]

此驗證器檢查輸入欄位是否兩次都輸入正確。例如,如果您希望使用者兩次輸入他的密碼以確保他輸入了正確的密碼(這在網站註冊時經常看到),那麼這就是您要使用的助手。要使用它,請確保在您的檢視中正確定義它(注意_confirmation

<%= text_field :user, :password%>
<%= text_field :user, :password_confirmation %>

validates_format_of

[編輯 | 編輯原始碼]

validates_format_of接受一個正則表示式,並檢查輸入是否與 :with 子句提供的模式匹配。還要注意,我們在這裡使用了一個自定義訊息。這可以在每個驗證器中以相同的方式完成。

validates_format_of :username, :with => /\A[a-zA-Z]+\z/,  :message => "Please use only regular letters as username"

validates_length_of/validates_size_of

[編輯 | 編輯原始碼]
validates_length_of :username, :minimum => 5, :maximum => 50
validates_size_of :address, :in => 5..100

length_of/size_of驗證器在您需要檢查輸入的字元長度是否滿足特定要求時很有用。在上面的示例中,使用者名稱長度不能超過 50 個字元,也不能少於 5 個字元。或者,您可以指定一個範圍,該範圍應該為真才能驗證。上面,地址應該包含 5 到 100 個字元。請注意length_ofsize_of/是相同的。

validates_numericality_of

[編輯 | 編輯原始碼]
validates_numericality_of :amount_available

檢查輸入是否為任何型別的數字。為了確保輸入只是整數,您可以使用可選的:only_integer => true命令。此命令有一些有用的選項,例如:greater_than => 100確保給定的數字大於 100:因此 101 將是第一個有效數字。

validates_presence_of

[編輯 | 編輯原始碼]
validates_presence_of :name

最基本的驗證器之一,它檢查給定的表單元素(在本例中為“name”)中是否輸入了任何內容。

validates_uniqueness_of

[編輯 | 編輯原始碼]
validates_uniqueness_of :username

最後,一個比較高階的驗證器:它檢查資料庫中是否存在指定的屬性值。在這種情況下,如果使用者選擇使用者名稱“Paul”,而“Paul”已經存在於資料庫的使用者名稱列中,則它將不會透過驗證。

使用範圍

[編輯 | 編輯原始碼]

它還可以驗證指定屬性的值是否基於多個範圍引數是唯一的。例如,確保老師在某個學期只能在某個特定課程的課程表中出現一次。

validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]

建立記錄時,會執行檢查以確保資料庫中不存在具有指定屬性(對映到列)的給定值的記錄。更新記錄時,會進行相同的檢查,但會忽略記錄本身。

配置選項

[編輯 | 編輯原始碼]
  • message - 指定自定義錯誤訊息(預設值為:“已被使用”)
  • scope - 一個或多個用於限制唯一約束範圍的列。
  • if - 指定要呼叫的方法、proc 或字串以確定是否應進行驗證(例如 :if => :allow_validation,或 :if => Proc.new { |user| user.signup_step > 2 })。方法、proc 或字串應該返回或計算為真值或假值。

編寫驗證時,請記住您可以將所有這些選項混合使用,並且還有更多高階功能,您可能想檢視一下。

華夏公益教科書