モデルの状態を確認し、無効なエラーコレクションにメッセージを追加するメソッドを作成することもできます。次に、検証メソッドの名前のシンボルを渡して、検証(API)クラスメソッドを使用してこれらのメソッドを登録する必要があります。
クラスメソッドごとに複数のシンボルを渡すことができ、それぞれの検証は登録された順序と同じ順序で実行されます。
有効な?この方法は、エラーコレクションが空であることが確認されますので、あなたが失敗する検証を希望する場合、カスタム検証メソッドがそれにエラーを追加する必要があります
class Invoice < ApplicationRecord
validate :expiration_date_cannot_be_in_the_past,
:discount_cannot_be_greater_than_total_value
def expiration_date_cannot_be_in_the_past
if expiration_date.present? && expiration_date < Date.today
errors.add(:expiration_date, "can't be in the past")
end
end
def discount_cannot_be_greater_than_total_value
if discount > total_value
errors.add(:discount, "can't be greater than total value")
end
end
end
デフォルトでは、そのような検証は、有効な呼び出すたびに実行されますか?またはオブジェクトを保存します。しかし、これらのカスタム検証をいつ実行するかは、:createまたは:updateのどちらかを指定してvalidateメソッドに:onオプションを指定することで制御することもできます。
class Invoice < ApplicationRecord
validate :active_customer, on: :create
def active_customer
errors.add(:customer_id, "is not active") unless customer.active?
end
end