プロゲート少しやっていた。
class User < ApplicationRecord
.
.
.
validates :email, {presence: true, uniqueness:true}
.
.
.
end
railsガイドで目的と合いそうなものを探す
2.6 format
このヘルパーは、withオプションで与えられた正規表現と属性の値がマッチするかどうかを検証します。
class Product < ApplicationRecord
validates :legacy_code, format: { with: /\A[a-zA-Z]+\z/,
message: "英文字のみが使えます" }
end
:withoutオプションを使うと、指定の属性にマッチしない正規表現を指定することもできます。
デフォルトのエラーメッセージは「is invalid」です。
出典
2.3 confirmation
このヘルパーは、2つのテキストフィールドで受け取る内容が完全に一致する必要がある場合に使います。たとえば、メールアドレスやパスワードで、確認フィールドを使うとします。このバリデーションヘルパーは仮想の属性を作成します。属性の名前は、確認したい属性名に「_confirmation」を追加したものになります。
class Person < ApplicationRecord
validates :email, confirmation: true
end
ビューテンプレートで以下のようなフィールドを用意します。
<%= text_field :person, :email %>
<%= text_field :person, :email_confirmation %>
このチェックは、email_confirmationがnilでない場合のみ行われます。確認を必須にするには、以下のように確認用の属性について存在チェックも追加してください。presenceを利用する存在チェックについてはこの後解説します。
class Person < ApplicationRecord
validates :email, confirmation: true
validates :email_confirmation, presence: true
end
:case_sensitiveオプションを用いて、大文字小文字の違いを確認する制約をかけるかどうかも定義できます。デフォルトでは、このオプションはtrueになります。
class Person < ApplicationRecord
validates :email, confirmation: { case_sensitive: false }
end
このヘルパーのデフォルトメッセージは「doesn't match confirmation」です。
出典
2.10 presence
このヘルパーは、指定された属性が空(empty)でないことを確認します。値がnilや空文字でない、つまり空でもなければホワイトスペースでもないことを確認するために、内部でblank?メソッドを使っています。
class Person < ApplicationRecord
validates :name, :login, :email, presence: true
end
関連付けが存在することを確認したい場合、関連をマッピングするために使われる外部キーではなく、関連するオブジェクト自体が存在するかどうかを検証する必要があります。以下の例では、外部キーが空ではないことと、関連付けられたオブジェクトが存在することをチェックしています。
class Supplier < ApplicationRecord
has_one :account
validates :account, presence: true
end
関連付けられたレコードの存在が必須の場合、これを検証するには:inverse_ofオプションでその関連付けを指定する必要があります。
関連付けが存在し、かつ有効であることを確かめるには、validates_associatedも使う必要があります。
class Order < ApplicationRecord
has_many :line_items, inverse_of: :order
end
このヘルパーを使って、has_oneまたはhas_manyリレーションシップを経由して関連付けられたオブジェクトが存在することを検証すると、blank?でもなくmarked_for_destruction?(削除用マーク済み)でもないかどうかがチェックされます。
false.blank?は常にtrueなので、真偽値に対してこのメソッドを使うと正しい結果が得られません。真偽値の存在をチェックしたい場合は、以下のいずれかを使う必要があります。
validates :boolean_field_name, inclusion: [true, false]
validates :boolean_field_name, exclusion: [nil]
これらのバリデーションのいずれかを使うことで、値が決してnilにならないようにできます。nilがあると、ほとんどの場合NULL値になります。
出典
2.12 uniqueness
このヘルパーは、オブジェクトが保存される直前に、属性の値が一意(unique)であり重複していないことを検証します。このヘルパーは一意性の制約をデータベース自体には作成しないので、本来一意にすべきカラムに、たまたま2つのデータベース接続によって同じ値を持つレコードが2つ作成される可能性が残ります。これを避けるには、データベースのそのカラムに一意インデックスを作成する必要があります。
class Account < ApplicationRecord
validates :email, uniqueness: true
end
このバリデーションは、その属性と同じ値を持つ既存のレコードがモデルのテーブルにあるかどうかを調べるSQLクエリを実行することで行われます。
このヘルパーには、一意性チェックの範囲を限定する別の属性を指定する:scopeオプションがあります。
class Holiday < ApplicationRecord
validates :name, uniqueness: { scope: :year,
message: "発生は年に1度である必要があります" }
end
:scopeを用いる一意性バリデーション違反を防止する目的でデータベース側に制約を作成したい場合は、データベース側で両方のカラムにuniqueインデックスを作成しなければなりません。MySQLのマニュアルでマルチカラムインデックスについての情報を参照するか、PostgreSQLのマニュアルでカラムのグループを参照する一意性制約についての例を参照してください。
このヘルパーには:case_sensitiveというオプションもあります。これは一意性制約で大文字小文字を区別するか、またはデータベースのデフォルトの照合順序(collation)を尊重するかどうかを定義できます。このオプションはデフォルトで、データベースのデフォルト照合順序を尊重します。
class Person < ApplicationRecord
validates :name, uniqueness: { case_sensitive: false }
end
一部のデータベースでは検索で常に大文字小文字を区別しない設定になっているものがあります。
デフォルトのエラーメッセージは「has already been taken」です。
出典
2.14 validates_each モデルの属性に共通するバリデーションがあればこれでまとめて処理してくれるのかな?
このヘルパーは、1つのブロックに対して属性を検証します。定義済みのバリデーション関数はありません。このため、ブロックを使うバリデーションを自分で作成し、validates_eachに渡すすべての属性がブロックに対してテストされるようにする必要があります。以下の例は、苗字と名前が小文字で始まらないようにしたい場合です。
class Person < ApplicationRecord
validates_each :name, :surname do |record, attr, value|
record.errors.add(attr, '冒頭は大文字にする必要があります') if value =~ /\A[[:lower:]]/
end
end
このブロックは、レコードと属性の名前、そして属性の値を受け取ります。ブロック内でこれらを使ってデータが正しいかどうかを自由にチェックできます。バリデーションに失敗した場合はモデルにエラーメッセージを追加して、バリデーションが無効になるようにしてください。
出典