acceptance驗證
acceptance 是 Rails 中的一個驗證器(validator),用於驗證一個布爾類型的屬性是否被接受。在表單中,通常會有一些複選框或單選按鈕,用户需要勾選或選擇才能提交表單。acceptance 驗證器用於確保這些複選框或單選按鈕已經被選中或勾選。
當一個屬性被驗證時,acceptance 驗證器會檢查該屬性是否為 true。如果為 true,則驗證通過;否則,驗證失敗,並將錯誤信息添加到模型對象的 errors 集合中。
例如,在下面的代碼中,acceptance 驗證器用於驗證 terms_of_service 屬性是否被接受:
class Person < ApplicationRecord
validates :terms_of_service, acceptance: true
end
在這個例子中,如果一個 Person 對象的 terms_of_service 屬性沒有被設置為 true,那麼該對象就無法通過驗證,並且會在 errors 集合中添加一個名為 terms_of_service 的錯誤信息。
在表單中,可以使用 Rails 提供的 check_box 或 radio_button 輔助方法來生成複選框或單選按鈕,並自動添加 acceptance 驗證器。例如:
<%= form_for @person do |f| %>
<%= f.label :terms_of_service do %>
<%= f.check_box :terms_of_service %>
I agree to the terms of service
<% end %>
<% end %>
這個表單會生成一個名為 terms_of_service 的複選框,並自動將其關聯到 Person 模型類的 terms_of_service 屬性。當用户提交表單時,如果複選框被選中,那麼該屬性會被設置為 true,並且表單數據就可以被提交。如果複選框沒有被選中,那麼表單數據無法通過驗證,並且會顯示一個名為 terms_of_service 的錯誤信息。
validates_associated
當您的模型與其他模型有關聯,並且它們也需要驗證時,您應該使用這個幫助器。當你試圖保存對象時,有效嗎?將在每個相關對象上調用。
class Library < ApplicationRecord
has_many :books
validates_associated :books
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Library 的類,並建立了與 Book 模型類的關聯關係。它使用了 has_many 方法來指定一個圖書館可以擁有多本書,並使用了 validates_associated 方法來確保與該模型關聯的書籍數據也是有效的。
has_many 方法用於在模型類之間建立一對多的關聯關係。在這個例子中,Library 模型類通過 has_many :books 方法指定一個圖書館可以擁有多本書。這個方法會自動為 Library 類生成一個名為 books 的實例方法,該方法用於返回與該圖書館相關聯的所有書籍的集合。同時,它還會自動為 Book 類生成一個名為 library 的實例方法,該方法用於返回與該書籍相關聯的圖書館對象。
validates_associated 方法用於驗證與該模型類關聯的其他模型類的數據是否有效。在這個例子中,validates_associated :books 方法用於驗證與 Library 模型類關聯的所有書籍數據是否有效。如果任何一本書籍的數據無效,那麼整個圖書館對象都無法通過驗證,並且會在模型對象的 errors 集合中添加一個名為 books 的錯誤信息。
需要注意的是,validates_associated 方法只驗證與該模型類關聯的其他模型類的數據是否有效,而不會驗證該模型類本身的數據是否有效。因此,如果需要同時驗證該模型類本身的數據和與其關聯的其他模型類的數據,還需要使用其他的驗證器來實現。
confirmation確認
class Person < ApplicationRecord
validates :email, confirmation: true
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Person 的類,並對其中的 email 屬性進行驗證。
在這個例子中,validates 方法用於為 email 屬性添加驗證規則。具體來説,使用了 confirmation 選項,表示需要對 email 屬性進行確認驗證。這意味着在表單中提交時,除了輸入 email 屬性的值之外,還需要再次輸入相同的值,以便驗證兩次輸入的值是否一致。如果兩次輸入的值不一致,則會在模型對象的 errors 集合中添加一個名為 email_confirmation 的錯誤信息。
需要注意的是,confirmation 驗證器只適用於需要確認的屬性,例如密碼和電子郵件地址等。如果要對其他類型的屬性進行驗證,可以使用其他的驗證器來實現。
class Person < ApplicationRecord
validates :email, confirmation: true
validates :email_confirmation, presence: true
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Person 的類,並對其中的 email 屬性進行驗證。
在這個例子中,validates 方法用於為 email 屬性添加驗證規則。具體來説,使用了 confirmation 選項,表示需要對 email 屬性進行確認驗證。這意味着在表單中提交時,除了輸入 email 屬性的值之外,還需要再次輸入相同的值,以便驗證兩次輸入的值是否一致。如果兩次輸入的值不一致,則會在模型對象的 errors 集合中添加一個名為 email_confirmation 的錯誤信息。
在這個例子中,還添加了另一個驗證規則,用於驗證 email_confirmation 屬性的存在性。這是因為在進行 email 屬性的確認驗證時,需要通過表單中的 email_confirmation 屬性來獲取確認電子郵件地址的值。因此,如果 email_confirmation 屬性不存在或為空,確認驗證將無法進行,因此需要驗證其存在性。
需要注意的是,confirmation 驗證器只適用於需要確認的屬性,例如密碼和電子郵件地址等。如果要對其他類型的屬性進行驗證,可以使用其他的驗證器來實現。
驗證大小寫
class Person < ApplicationRecord
validates :email, confirmation: { case_sensitive: false }
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Person 的類,並對其中的 email 屬性進行驗證。
在這個例子中,validates 方法用於為 email 屬性添加驗證規則。具體來説,使用了 confirmation 選項,並傳遞了一個名為 case_sensitive 的哈希參數,將其設置為 false。這意味着在進行電子郵件地址確認驗證時,將忽略電子郵件地址的大小寫。例如,如果 email 屬性的值為 "example@example.com",則確認驗證器會接受 "Example@example.com" 或其他任何大小寫組合的電子郵件地址作為有效值。
需要注意的是,confirmation 驗證器只適用於需要確認的屬性,例如密碼和電子郵件地址等。如果要對其他類型的屬性進行驗證,可以使用其他的驗證器來實現。
comparison比較
class Promotion < ApplicationRecord
validates :start_date, comparison: { greater_than: :end_date }
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Promotion 的類,並對其中的 start_date 屬性進行驗證。
在這個例子中,validates 方法用於為 start_date 屬性添加驗證規則。具體來説,使用了 comparison 選項,並傳遞了一個名為 greater_than 的哈希參數,將其設置為 end_date。這意味着要驗證 start_date 屬性的值是否大於 end_date 屬性的值。
需要注意的是,comparison 驗證器是 Rails 6 中引入的新特性,在 Rails 5 中不存在。它用於比較兩個屬性的值,並驗證它們之間的關係,包括大於、小於、大於等於、小於等於等關係。在本例中,使用了 greater_than 選項,表示要驗證 start_date 屬性的值是否大於 end_date 屬性的值。
在實際使用中,可以在表單中添加名為 start_date 和 end_date 的日期選擇器,用於輸入促銷活動的開始日期和結束日期。例如:
<%= form_for @promotion do |f| %>
<%= f.label :start_date %>
<%= f.date_field :start_date %>
<%= f.label :end_date %>
<%= f.date_field :end_date %>
<%= f.submit "Save" %>
<% end %>
這個表單會生成名為 start_date 和 end_date 的日期選擇器,用於輸入促銷活動的開始日期和結束日期。當用户提交表單時,它會驗證 start_date 屬性的值是否大於 end_date 屬性的值,並將模型對象存儲到數據庫中。如果 start_date 屬性的值小於或等於 end_date 屬性的值,則會顯示一個名為 start_date 的錯誤信息。
這些是 Active Record 驗證器 comparison 選項中可用的比較運算符及其默認錯誤消息:
:greater_than- 指定值必須大於提供的值。該選項的默認錯誤消息為 "必須大於 %{count}"。:greater_than_or_equal_to- 指定值必須大於或等於提供的值。該選項的默認錯誤消息為 "必須大於或等於 %{count}"。:equal_to- 指定值必須等於提供的值。該選項的默認錯誤消息為 "必須等於 %{count}"。:less_than- 指定值必須小於提供的值。該選項的默認錯誤消息為 "必須小於 %{count}"。:less_than_or_equal_to- 指定值必須小於或等於提供的值。該選項的默認錯誤消息為 "必須小於或等於 %{count}"。:other_than- 指定值必須不等於提供的值。該選項的默認錯誤消息為 "必須不等於 %{count}"。
這些選項可以用於在 Active Record 模型中驗證屬性的值是否符合指定的比較運算符。例如,可以使用 :greater_than 選項來驗證某個屬性的值必須大於指定的值:
validates :some_attribute, comparison: { greater_than: 10 }
這會在模型對象上添加一個驗證規則,以確保 some_attribute 屬性的值大於 10。如果該屬性的值小於或等於 10,則會在模型對象的 errors 集合中添加一個錯誤消息,該消息的內容為 "must be greater than 10"。如果需要自定義錯誤消息,可以在 validates 方法中使用 message 選項來指定它,例如:
validates :some_attribute, comparison: { greater_than: 10, message: "must be greater than 10!" }
這會在模型對象上添加一個驗證規則,以確保 some_attribute 屬性的值大於 10。如果該屬性的值小於或等於 10,則會在模型對象的 errors 集合中添加一個錯誤消息,該消息的內容為 "must be greater than 10!"。
exclusion排除
class Account < ApplicationRecord
validates :subdomain, exclusion: { in: %w(www us ca jp),
message: "%{value} is reserved." }
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Account 的類,並對其中的 subdomain 屬性進行驗證。
在這個例子中,validates 方法用於為 subdomain 屬性添加驗證規則。具體來説,使用了 exclusion 選項,並傳遞了一個哈希參數,將其設置為 in 選項為 ["www", "us", "ca", "jp"]。這意味着要驗證 subdomain 屬性的值是否不在這個數組中。
如果 subdomain 屬性的值在指定的數組中,將會在模型對象的 errors 集合中添加一個錯誤消息,該消息的內容為 "%{value} is reserved.",其中 %{value} 會被替換為實際的屬性值。
在實際使用中,這個驗證器可以用於確保用户輸入的 subdomain 屬性值不是某些預留的關鍵字,例如在一個多租户的應用程序中,可能需要保留一些子域名用於系統的內部使用,而不允許用户創建這些子域名。例如:
validates :subdomain, exclusion: { in: %w(www us ca jp),
message: "%{value} is reserved for internal use." }
這個驗證器會在用户提交表單時驗證 subdomain 屬性,並確保其值不在 ["www", "us", "ca", "jp"] 數組中。如果 subdomain 屬性的值在指定的數組中,將會顯示一個錯誤消息,該消息的內容為 "%{value} is reserved for internal use."。如果需要自定義錯誤消息,可以在 validates 方法中使用 message 選項來指定它。
format格式
class Product < ApplicationRecord
validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/,
message: "only allows letters" }
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Product 的類,並對其中的 legacy_code 屬性進行驗證。
在這個例子中,validates 方法用於為 legacy_code 屬性添加驗證規則。具體來説,使用了 format 選項,並傳遞了一個哈希參數,將其設置為 with 選項為 /\A[a-zA-Z]+\z/。這意味着要驗證 legacy_code 屬性的值是否只包含字母,且不包含空格、數字或其他字符。
如果 legacy_code 屬性的值不符合指定的正則表達式,則會在模型對象的 errors 集合中添加一個錯誤消息,該消息的內容為 "only allows letters"。
在實際使用中,這個驗證器可以用於確保用户輸入的 legacy_code 屬性值只包含字母,例如在一個產品管理系統中,可能需要保證產品的代碼是由字母組成的,而不允許包含其他字符。例如:
validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/,
message: "only allows letters and no other characters or spaces" }
這個驗證器會在用户提交表單時驗證 legacy_code 屬性,並確保其值只包含字母。如果 legacy_code 屬性的值包含非字母字符,則會顯示一個錯誤消息,該消息的內容為 "only allows letters and no other characters or spaces"。如果需要自定義錯誤消息,可以在 validates 方法中使用 message 選項來指定它。
inclusion包含
class Coffee < ApplicationRecord
validates :size, inclusion: { in: %w(small medium large),
message: "%{value} is not a valid size" }
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Coffee 的類,並對其中的 size 屬性進行驗證。
在這個例子中,validates 方法用於為 size 屬性添加驗證規則。具體來説,使用了 inclusion 選項,並傳遞了一個哈希參數,將其設置為 in 選項為 ["small", "medium", "large"]。這意味着要驗證 size 屬性的值是否在指定的數組中。
如果 size 屬性的值不在指定的數組中,則會在模型對象的 errors 集合中添加一個錯誤消息,該消息的內容為 "%{value} is not a valid size",其中 %{value} 會被替換為實際的屬性值。
在實際使用中,這個驗證器可以用於確保用户輸入的 size 屬性值是預定義的值之一,例如在一個咖啡店管理系統中,可能需要確保咖啡杯的大小是預定義的幾種規格之一,而不允許用户輸入其他值。例如:
validates :size, inclusion: { in: %w(small medium large),
message: "%{value} is not a valid cup size. Please choose small, medium or large." }
這個驗證器會在用户提交表單時驗證 size 屬性,並確保其值是 ["small", "medium", "large"] 數組中的一項。如果 size 屬性的值不在指定的數組中,則會顯示一個錯誤消息,該消息的內容為 "%{value} is not a valid cup size. Please choose small, medium or large."。如果需要自定義錯誤消息,可以在 validates 方法中使用 message 選項來指定它。
length
class Person < ApplicationRecord
validates :name, length: { minimum: 2 }
validates :bio, length: { maximum: 500 }
validates :password, length: { in: 6..20 }
validates :registration_number, length: { is: 6 }
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Person 的類,並對其中的幾個屬性進行驗證。
在這個例子中,validates 方法用於為 name、bio、password 和 registration_number 屬性添加驗證規則。具體來説:
validates :name, length: { minimum: 2 }表示要驗證name屬性的長度是否至少為 2 個字符。validates :bio, length: { maximum: 500 }表示要驗證bio屬性的長度是否不超過 500 個字符。validates :password, length: { in: 6..20 }表示要驗證password屬性的長度是否在 6 到 20 個字符之間。validates :registration_number, length: { is: 6 }表示要驗證registration_number屬性的長度是否恰好為 6 個字符。
如果任何一個屬性的值不符合指定的長度要求,則會在模型對象的 errors 集合中添加一個錯誤消息。
在實際使用中,這些驗證器可以用於確保用户輸入的屬性值符合預期的長度要求。例如,name 屬性可能需要至少包含兩個字符,以確保姓名的有效性。bio 屬性可能需要限制在 500 個字符以內,以確保用户不會輸入過長的自我介紹。password 屬性可能需要在安全性和易用性之間找到平衡,因此長度可能需要在一定範圍內。registration_number 屬性可能需要確保長度恰好為 6 個字符,以確保準確性。
需要注意的是,這些驗證器只是驗證屬性的長度,而不是內容。如果需要對屬性的內容進行驗證,可以使用其他類型的驗證器,例如 presence、format 等。
默認錯誤消息取決於正在執行的長度驗證的類型。您可以使用:wrong_length、:too_long和:too_short選項定製這些消息,並使用%{count}作為與所使用的長度約束相對應的數字的佔位符。您仍然可以使用:message選項來指定錯誤消息
class Person < ApplicationRecord
validates :bio, length: { maximum: 1000,
too_long: "%{count} characters is the maximum allowed" }
end
numericality數值
class Player < ApplicationRecord
validates :points, numericality: true
validates :games_played, numericality: { only_integer: true }
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Player 的類,並對其中的 points 和 games_played 屬性進行驗證。
在這個例子中,validates 方法用於為 points 屬性添加一個驗證規則。具體來説,使用了 numericality 選項,表示要驗證屬性的值是否為數值類型。這個驗證器將確保 points 屬性的值包含一個有效的數值。例如,如果 points 的值為 "123" 或 "123.45",則驗證將通過,但如果 points 的值為 "abc" 或 "123abc",則驗證將失敗。
在第二個驗證器中,同時通過了 numericality 和 only_integer 選項,表示要驗證 games_played 屬性的值是否為整數類型。這個驗證器將確保 games_played 屬性的值為一個整數。例如,如果 games_played 的值為 "123",則驗證將通過,但如果 games_played 的值為 "123.45" 或 "abc",則驗證將失敗。
需要注意的是,這些驗證器只是驗證屬性的值是否為數值類型或整數類型,而不是具體的值是否符合特定的條件。如果需要對屬性的值進一步驗證,可以使用其他類型的驗證器,例如 inclusion、exclusion、length、format 等。
在實際應用中,這些驗證器可以用於確保 Player 對象的 points 和 games_played 屬性包含有效的數值或整數類型的值。如果驗證失敗,則會在模型對象的 errors 集合中添加一個錯誤消息。這個錯誤消息的默認內容為 "is not a number" 或 "must be an integer",具體內容取決於驗證器的選項。如果需要自定義錯誤消息,可以像我在之前的回答中所述那樣使用 message 選項。
這些選項是用於 numericality 驗證器的子選項,用於進一步驗證屬性的值是否符合特定的條件,具體説明如下:
greater_than- 指定屬性的值必須大於指定的值。默認錯誤消息為 "must be greater than %{count}"。greater_than_or_equal_to- 指定屬性的值必須大於或等於指定的值。默認錯誤消息為 "must be greater than or equal to %{count}"。equal_to- 指定屬性的值必須等於指定的值。默認錯誤消息為 "must be equal to %{count}"。less_than- 指定屬性的值必須小於指定的值。默認錯誤消息為 "must be less than %{count}"。less_than_or_equal_to- 指定屬性的值必須小於或等於指定的值。默認錯誤消息為 "must be less than or equal to %{count}"。other_than- 指定屬性的值必須不等於指定的值。默認錯誤消息為 "must be other than %{count}"。in- 指定屬性的值必須在指定的範圍內。默認錯誤消息為 "must be in %{count}"。odd- 如果設置為 true,則指定屬性的值必須是奇數。默認錯誤消息為 "must be odd"。even- 如果設置為 true,則指定屬性的值必須是偶數。默認錯誤消息為 "must be even"。
這些選項可以與其他驗證器組合使用,以進一步驗證屬性的值是否符合特定的條件,並提供自定義錯誤消息。例如,可以使用以下驗證器驗證屬性的值是否為正數:
validates :number, numericality: { greater_than: 0, message: "must be a positive number" }
如果屬性的值不是正數,則會在模型對象的 errors 集合中添加一個錯誤消息,內容為 "must be a positive number"。這樣可以幫助開發者更好地控制數據的有效性,提高應用程序的穩定性和可靠性。
presence驗證為空
class Person < ApplicationRecord
validates :name, :login, :email, presence: true
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Person 的類,並對其中的 name、login 和 email 屬性進行驗證。
在這個例子中,validates 方法用於為 name、login 和 email 屬性添加一個驗證規則。具體來説,使用了 presence 選項,表示要驗證屬性的值是否存在,即不能為空值或空字符串。這個驗證器將確保 name、login 和 email 屬性的值都不為空。如果其中任何一個屬性的值為空,則驗證將失敗。
需要注意的是,presence 驗證器只是驗證屬性的值是否存在,而不是具體的值是否符合特定的條件。如果需要對屬性的值進一步驗證,可以使用其他類型的驗證器,例如 length、format、inclusion、exclusion 等。
在實際應用中,這些驗證器可以用於確保 Person 對象的 name、login 和 email 屬性都不為空。如果驗證失敗,則會在模型對象的 errors 集合中添加一個錯誤消息。這個錯誤消息的默認內容為 "can't be blank",表示屬性的值不能為空。如果需要自定義錯誤消息,可以像我在之前的回答中所述那樣使用 message 選項。
absence
class Person < ApplicationRecord
validates :name, :login, :email, absence: true
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Person 的類,並對其中的 name、login 和 email 屬性進行驗證。
在這個例子中,validates 方法用於為 name、login 和 email 屬性添加一個驗證規則。具體來説,使用了 absence 選項,表示要驗證屬性的值是否不存在,即必須為 nil 或空字符串。這個驗證器將確保 name、login 和 email 屬性的值都不存在。如果其中任何一個屬性的值不為空,則驗證將失敗。
需要注意的是,absence 驗證器與 presence 驗證器相反。presence 驗證器用於驗證屬性的值是否存在,而absence 驗證器用於驗證屬性的值是否不存在。這兩個驗證器都是用於確保屬性的值符合預期,並且避免了數據不一致的情況。
在實際應用中,這些驗證器可以用於確保 Person 對象的 name、login 和 email 屬性都不存在。如果驗證失敗,則會在模型對象的 errors 集合中添加一個錯誤消息。這個錯誤消息的默認內容為 "must be blank",表示屬性的值必須為空。如果需要自定義錯誤消息,可以像我在之前的回答中所述那樣使用 message 選項。
uniqueness唯一性
class Account < ApplicationRecord
validates :email, uniqueness: true
end
這段代碼是一個 Rails 應用程序中的 ActiveRecord 模型類,它用於定義一個名為 Account 的類,並對其中的 email 屬性進行驗證。
在這個例子中,validates 方法用於為 email 屬性添加一個驗證規則。具體來説,使用了 uniqueness 選項,表示要驗證屬性的值是否唯一。這個驗證器將確保 email 屬性的值在整個 Account 表中都是唯一的。如果有多個 Account 對象具有相同的 email 屬性值,則驗證將失敗。
需要注意的是,uniqueness 驗證器用於確保屬性的值在整個表中是唯一的,它不會驗證屬性的值是否存在。如果需要同時驗證屬性的存在性,可以在驗證器鏈中使用 presence 驗證器。
在實際應用中,這個驗證器可以用於確保 Account 對象的 email 屬性是唯一的。如果驗證失敗,則會在模型對象的 errors 集合中添加一個錯誤消息。這個錯誤消息的默認內容為 "has already been taken",表示屬性的值已經被佔用了。如果需要自定義錯誤消息,可以像我在之前的回答中所述那樣使用 message 選項。
validates_with自定義驗證器
validates_with 是 ActiveRecord 模型類中的一個方法,它用於將自定義驗證器添加到模型類中,以驗證模型對象的屬性。
使用 validates_with 方法可以將自定義驗證器添加到模型類中,例如:
class Person < ApplicationRecord
validates_with GoodnessValidator
end
在這個例子中,我們將 GoodnessValidator 自定義驗證器添加到 Person 模型類中。當我們在創建或更新 Person 對象時,GoodnessValidator 將會被調用,以驗證 Person 對象的屬性。
需要注意的是,validates_with 方法和其他內置驗證方法(如 validates_presence_of、validates_uniqueness_of 等)有所不同,它不會自動添加錯誤消息到模型對象的 errors 集合中。相反,自定義驗證器需要自行處理錯誤消息的添加。
在自定義驗證器的 validate 方法中,我們可以使用 record.errors.add 方法將錯誤消息添加到模型對象的 errors 集合中。例如:
class GoodnessValidator < ActiveModel::Validator
def validate(record)
if record.first_name == "Evil"
record.errors.add :base, "This person is evil"
end
end
end
在這個示例中,如果 Person 對象的 first_name 屬性為 "Evil",則會在模型對象的 errors 集合中添加一個錯誤消息,指示此人是邪惡的。
因此,使用 validates_with 方法需要自定義驗證器開發人員具備一定的 Ruby 編程知識和技能,以確保驗證器能夠正確地處理錯誤消息的添加和其他驗證邏輯。
validates_each
class Person < ApplicationRecord
validates_each :name, :surname do |record, attr, value|
record.errors.add(attr, 'must start with upper case') if value =~ /\A[[:lower:]]/
end
end
這段代碼定義了一個 Person 模型類,並使用 validates_each 方法為 name 和 surname 兩個屬性添加了一個自定義驗證器。
validates_each 方法是一個 Rails 提供的方法,它允許我們為指定的屬性添加自定義驗證器代碼塊。在這個例子中,我們使用了 validates_each 方法並傳入兩個參數 name 和 surname,這意味着我們將為這兩個屬性添加自定義驗證器。
自定義驗證器代碼塊中的第一個參數 record 是當前正在驗證的模型對象。第二個參數 attr 是當前正在驗證的屬性名稱,第三個參數 value 是當前屬性的值。
在這個例子中,我們使用了一個正則表達式 /\A[[:lower:]]/ 來檢查屬性值是否以小寫字母開頭。如果是,我們就在模型對象的 errors 數組中添加一個錯誤消息,以通知用户該屬性必須以大寫字母開頭。
需要注意的是,使用 validates_each 方法允許我們為屬性添加更加複雜的自定義驗證邏輯,而不僅僅是簡單的比較或格式驗證。然而,需要注意的是,由於自定義驗證器是在每次驗證時被調用的,因此如果驗證邏輯較為複雜,它可能會對性能產生一定的影響。