LoginSignup
0
0

More than 5 years have passed since last update.

Active Recordのバリデーションについて調べてみた1

Last updated at Posted at 2018-10-16

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?
user.rb
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 }]

user.rb
class User < ApplicationRecord
  validates :name, presence: true
end

user = User.new
user.valid? # => false
user.errors.details[:name] # => [{errors: :blank}]

これから調べること

  • 条件付きのバリデーション
  • バリデーションヘルパーについてさらう
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0