Ruby on Rails
ActiveRecord検証
サーチ…
属性の数値の検証
この検証は、数値のみの挿入を制限します。
class Player < ApplicationRecord
validates :points, numericality: true
validates :games_played, numericality: { only_integer: true }
end
これ以外に:only_integer
、このヘルパーは、受け入れ可能な値に制約を追加するために次のオプションも受け入れます:
-
:greater_than
- 値が指定された値より大きくなければならないことを指定します。このオプションのデフォルトのエラーメッセージは "%{count}より大きい必要があります"です。 -
:greater_than_or_equal_to
- 値が指定された値以上でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは、 "%{count}以上でなければなりません"です。 -
:equal_to
- 値が指定された値と等しくなければならないことを指定します。このオプションのデフォルトのエラーメッセージは "%{count}と等しくなければなりません"です。 -
:less_than
- 値が指定された値より小さくなければならないことを指定します。このオプションのデフォルトのエラーメッセージは "%{count}より小さい必要があります"です。 -
:less_than_or_equal_to
- 値が指定された値以下でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは、 "%{count}以下でなければなりません"です。 -
:other_than
- 値が指定された値以外でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは "%{count}以外である必要があります"です。 -
:odd
- trueに設定されている場合、値は奇数でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは、 "奇数でなければなりません"です。 -
:even
- trueに設定されている場合、値は偶数でなければならないことを指定します。このオプションのデフォルトのエラーメッセージは「必ず一致する必要があります」です。
デフォルトでは、数値ではnil値は使用できません。 allow_nil:trueオプションを使用して許可することができます。
属性の一意性を検証する
このヘルパーは、オブジェクトの保存直前に属性の値が一意であることを検証します。
class Account < ApplicationRecord
validates :email, uniqueness: true
end
一意性検査を制限するために使用される1つ以上の属性を指定するために使用できるa :scope
オプションがあります。
class Holiday < ApplicationRecord
validates :name, uniqueness: { scope: :year,
message: "should happen once per year" }
end
一意性制約が大文字と小文字を区別するかどうかを定義するために使用できる:case_sensitive
オプションもあります。このオプションのデフォルトはtrue
です。
class Person < ApplicationRecord
validates :name, uniqueness: { case_sensitive: false }
end
属性の存在の検証
このヘルパーは、指定された属性が空でないことを検証します。
class Person < ApplicationRecord
validates :name, presence: true
end
Person.create(name: "John").valid? # => true
Person.create(name: nil).valid? # => false
absence
ヘルパーを使用して、指定された属性が存在しないことを検証できます。それはpresent?
使用してpresent?
メソッドを使用して、ゼロまたは空の値をチェックします。
class Person < ApplicationRecord
validates :name, :login, :email, absence: true
end
注:属性がboolean
場合、通常の存在確認は使用できません(属性はfalse
値に対して有効ではありません)。これを含めるには、インクルード検証を使用します。
validates :attribute, inclusion: [true, false]
検証のスキップ
検証をスキップする場合は、次のメソッドを使用します。これらのメソッドは、オブジェクトが無効であってもオブジェクトをデータベースに保存します。
- デクリメント!
- decrement_counter
- インクリメント!
- increment_counter
- トグル!
- タッチ
- update_all
- update_attribute
- update_column
- update_columns
- update_counters
validate
を引数として渡して保存する際に検証をスキップすることもできsave
User.save(validate: false)
属性の長さの検証
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
可能な長さ制約オプションは次のとおりです。
-
:minimum
- 属性の長さは指定された長さを下回ることはできません。 -
:maximum
- 属性は指定された長さを超えることはできません。 -
:in
(または:within
) - 属性の長さは、指定された間隔に含める必要があります。このオプションの値は範囲でなければなりません。 -
:is
- 属性の長さは、指定された値と等しくなければなりません。
グループ化の検証
複数の検証で1つの条件を使用すると便利なことがあります。これはwith_optionsを使用して簡単に達成できます。
class User < ApplicationRecord
with_options if: :is_admin? do |admin|
admin.validates :password, length: { minimum: 10 }
admin.validates :email, presence: true
end
end
with_optionsブロック内のすべてのバリデーションは、次の場合に条件を自動的に渡します::is_admin?
カスタム検証
ActiveModel::Validator
またはActiveModel::EachValidator
継承する新しいクラスを追加して、独自の検証を追加できます。どちらの方法も似ていますが、若干異なる方法で動作します。
ActiveModel::Validator
およびvalidates_with
レコードを引数として受け取り、そのレコードに対してvalidate
実行するvalidate
メソッドを実装します。その後、モデル上のクラスでvalidates_with
を使用します。
# app/validators/starts_with_a_validator.rb
class StartsWithAValidator < ActiveModel::Validator
def validate(record)
unless record.name.starts_with? 'A'
record.errors[:name] << 'Need a name starting with A please!'
end
end
end
class Person < ApplicationRecord
validates_with StartsWithAValidator
end
ActiveModel::EachValidator
およびvalidate
単一のパラメータで共通のvalidate
メソッドを使用して新しいバリデーターを使用する場合は、 ActiveModel::EachValidator
から継承するクラスを作成し、 record
、 attribute
、およびvalue
3つの引数を取るvalidate_each
メソッドを実装しvalue
。
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
record.errors[attribute] << (options[:message] || 'is not an email')
end
end
end
class Person < ApplicationRecord
validates :email, presence: true, email: true
end
Railsガイドの詳細。
属性のフォーマットを検証します。
属性の値がformat
とwith
オプションを使用する正規表現と一致することを検証with
ます。
class User < ApplicationRecord
validates :name, format: { with: /\A\w{6,10}\z/ }
end
定数を定義し、その値を正規表現に設定してwith:
オプションに渡すこともできます。実際に複雑な正規表現の方が便利かもしれません
PHONE_REGEX = /\A\(\d{3}\)\d{3}-\d{4}\z/
validates :phone, format: { with: PHONE_REGEX }
デフォルトのエラーメッセージis invalid
です。これは:message
オプションで変更できます。
validates :bio, format: { with: /\A\D+\z/, message: "Numbers are not allowed" }
逆も返答し、値が正規表現と一致しないように指定することもできますwithout:
オプション
属性の包含を検証する
inclusion:
ヘルパーを使用して値が配列に含まれているかどうかを確認できます。 :in
オプションとそのエイリアス:in
:within
許容可能な値のセット。
class Country < ApplicationRecord
validates :continent, inclusion: { in: %w(Africa Antartica Asia Australia
Europe North America South America) }
end
値が配列に含まれていないかどうかを調べるには、 exclusion:
ヘルパーを使用します
class User < ApplicationRecord
validates :name, exclusion: { in: %w(admin administrator owner) }
end
条件付き検証
場合によっては、特定の条件下でのみレコードを検証する必要がある場合があります。
class User < ApplicationRecord
validates :name, presence: true, if: :admin?
def admin?
conditional here that returns boolean value
end
end
あなたが条件付きで本当に小さい場合は、Procを使うことができます:
class User < ApplicationRecord
validates :first_name, presence: true, if: Proc.new { |user| user.last_name.blank? }
end
負の条件の場合は、次の場合をunless
使用できます。
class User < ApplicationRecord
validates :first_name, presence: true, unless: Proc.new { |user| user.last_name.present? }
end
instance_eval
で実行される文字列を渡すこともできinstance_eval
:
class User < ApplicationRecord
validates :first_name, presence: true, if: 'last_name.blank?'
end
属性の確認
2つのテキストフィールドが同じ内容を正確に受け取る必要がある場合は、これを使用してください。たとえば、電子メールアドレスまたはパスワードを確認することができます。この検証によって、 _confirmation
付けて確認する_confirmation
があるフィールドの名前を名前とする仮想属性が作成されます。
class Person < ApplicationRecord
validates :email, confirmation: true
end
メモこのチェックは、 email_confirmation
がnilでない場合にのみ実行されます。
確認を要求するには、確認属性の存在チェックを必ず追加してください。
class Person < ApplicationRecord
validates :email, confirmation: true
validates :email_confirmation, presence: true
end
:onオプションを使う
:on
オプションを指定すると、検証がいつ行われるかを指定できます。すべてのビルトイン検証ヘルパーのデフォルトの動作は、新しいレコードを作成するときと更新するときの両方で、保存時に実行されます。
class Person < ApplicationRecord
# it will be possible to update email with a duplicated value
validates :email, uniqueness: true, on: :create
# it will be possible to create the record with a non-numerical age
validates :age, numericality: true, on: :update
# the default (validates on both create and update)
validates :name, presence: true
end