Rails Active Recordのバリデーションあまりよくわかっていないので、調べてみました。
バリデーションのヘルパーについては次回
バリデーションって?
正しい値だけをデータベースに保存するために、値を制限できる。保存の前に値の検証を行う
具体的な使用方法
バリデーションを実行するタイミングとトリガとなるメソッド
- 新規レコードを作成後、保存のアクションをするタイミングで実行
- 下記のメソッドは、バリデーションが実行されるため、バリデーションに引っかかると保存に失敗する
create, create!, save, save!, update, update!
!付きのメソッドは、破壊的メソッドでレコードが無効な場合は例外を発生させる。
非破壊的なメソッドの場合は無効の場合以下の挙動
save/update => false, create => オブジェクトを返す
バリデーションのスキップ
saveメソッドに validate: false
を与えると、バリデーションのスキップができる
save(validate: false)
===下記のメソッドもバリデーションをスキップする===
- decrement!
- decrement_counter
- increment!
- increment_counter
- toggle!
- touch
- update_all
- update_attribute
- update_column
- update_columns
- update_counters
バリデーションの確認メソッド
トリガになる処理を行う前に、手動でバリデーションを実行することもできる
- valid?
class User < ApplicationRecord
validates :name, presence: true
end
User.create(name: "piyopiyo").valid? # => true
User.create(name: nil).valid? # => false
-
errors.messages
バリデーション実行後、errors.messages
インスタンスメソッドを使用すると、発生したエラーが確認できる
(このメソッドはエラーのコレクションを返します。)
newでインスタンス化されたオブジェクトは、エラーが保存されない、createやsaveなどトリガなるメソッド実行時のみ -
errors[ ]
errors[:attribute]で、特定のオブジェクトの属性が有効かどうかを確認
User.create.errors[:user]
attributeの全てのエラーの配列を返す、属性でエラーが出なかった場合は空配列を返す -
errors.details[ ]
errors.details[:attribute]で、invalidな属性で、どのバリデーションが失敗したのかを確認
:errorがキーで、失敗したバリデーター
のシンボルが値となるハッシュの配列を返す
[{ error: :hogehoge }]
class User < ApplicationRecord
validates :name, presence: true
end
user = User.new
user.valid? # => false
user.errors.details[:name] # => [{errors: :blank}]
これから調べること
- 条件付きのバリデーション
- バリデーションヘルパーについてさらう