Part3 続き
前回の記事では、Railsの各種バリデータについてまとめました📙
今回はバリデーションで使用できる共通オプションと条件付きバリデーションについてまとめていきたいと思います!
バリデーションの共通オプション
Part2, Part3で紹介した各種バリデーションには、共通して使用できるオプションがいくつか存在します!ここではそれらについてまとめていきます✍️
| オプション名 | 説明 |
|---|---|
message |
カスタムエラーメッセージを指定 |
on |
バリデーションを実行するタイミングを指定 |
allow_nil |
属性の値がnilの場合、バリデーションをスキップ |
allow_blank |
属性の値が空文字列またはnilの場合、バリデーションをスキップ |
if |
条件が真の場合にのみバリデーションを実行 |
unless |
条件が偽の場合にのみバリデーションを実行 |
message
デフォルトのエラーメッセージをカスタムメッセージに変更したい場合に使用します!
エラーメッセージは文字列またはProcで指定できます。このオプションを使用しない場合は、各バリデーションに応じたデフォルトのエラーメッセージが使用されます。
class User < ApplicationRecord
validates :name, presence: { message: "ユーザー名を省略することはできません" }
validates :age, numericality: { message: "%{value}は有効な数値ではありません" }
end
文字列の場合、%{value}、%{attribute}、%{model}のいずれか、またはそれらの組み合わせを使用して、属性の値、属性名、モデル名をメッセージに含めることができます!
これらのプレースホルダは、バリデーションが失敗したときに対応する値に置き換えられます。
Procの:message値は、次の2つの引数を受け取ります。
- バリデーションの対象となるオブジェクト
- :modelと:attributeと:valueのキーバリューペアを含むハッシュ
参考:Railsガイド バリデーションの使い方より
class User < ApplicationRecord
validates :email,
uniqueness: {
message: -> (object, data) do
"#{object.name}様、#{data[:value]}はすでに使用されています。別のメールアドレスを入力してください。"
end
}
end
Procを使用することで、動的にエラーメッセージを生成することができます!
on
バリデーションを実行するタイミングを指定します!
デフォルトでは、すべての保存操作(createおよびupdate)でバリデーションが実行されますが、onオプションを使用して特定のタイミングでのみバリデーションを実行するように制限できます。
class User < ApplicationRecord
# 値が重複していてもnameを更新できる
validates :name, presence: true, on: :create
# 値が重複していてもemailを作成できる
validates :email, presence: true, on: :update
# デフォルトでは、作成・更新の両方でバリデーションが実行される
validates :age, numericality: { only_integer: true }
end
-
:create- レコードが新規作成されるときにのみバリデーションを実行します。 -
:update- 既存のレコードが更新されるときにのみバリデーションを実行します。
allow_nil
属性の値がnilの場合、バリデーションをスキップします!
class User < ApplicationRecord
validates :password, format: { with: /\A[a-zA-Z0-9]+\z/ }, allow_nil: true
end
この場合、password属性がnilの場合、formatバリデーションはスキップされます。
allow_blank
属性の値が空文字列またはnilの場合、バリデーションをスキップします!
使用場面は、入力フォームの任意項目などで空文字列が許容されるときが多いです。
class User < ApplicationRecord
validates :nickname, length: { maximum: 30 }, allow_blank: true
end
この場合、nickname属性が空文字列またはnilの場合、lengthバリデーションはスキップされます。
ifとunless
条件付きでバリデーションを実行したい場合に使用します!
ifオプションは条件が真の場合にのみバリデーションを実行し、unlessオプションは条件が偽の場合にのみバリデーションを実行します。
引数には、シンボル、Proc、Arrayが指定できます。
シンボルを渡す場合
class User < ApplicationRecord
validates :payment_method, presence: true, if: :premium_member?
def premium_member?
membership_type == 'premium'
end
end
Procを渡す場合
class User < ApplicationRecord
validates :discount_code, presence: true,
if: Proc.new { |user| user.age >= 65 }
end
Procオブジェクトを使えば、別のメソッドを定義せずに条件を直接指定できます!
シンプルな条件の場合はこちらの方が便利かもしれません。
またlambda記法(->)も使用できます。
class User < ApplicationRecord
validates :discount_code, presence: true, if: ->(user) { user.age >= 65 }
end
Part5へ続く
今回はバリデーションで使用できる共通オプションについてまとめました📚
次回はカスタムバリデーションについてまとめていきたいと思います!
参考記事
