LoginSignup
4
1

More than 3 years have passed since last update.

validates メソッドでユニーク制約を行うと ActiveRecord::RecordNotUnique ではなく、 ActiveRecord::RecordInvalid が raise される

Posted at

概要

DBのユニーク制約だけを行なっていた状態から、ユニーク制約の validates メソッドを書いたときにエラーハンドリングで少しはまったので共有です。

解説

DBのユニーク制約のみがかかっているとき

user.rb
# == Schema Information
#
# Table name: users
#
#  id         :bigint(8)        not null, primary key
#  name      :string(255)      not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#
# Indexes
#
#  index_users_on_name    (name) UNIQUE
#

class User < ApplicationRecord
end

ActiveRecord::RecordNotUnique が raise されます

sample.rb
User.create!(name: 'Duplication')
User.create!(name: 'Duplication')

=> ActiveRecord::RecordNotUnique

ユニーク制約の validates メソッドがあるとき

user.rb
# == Schema Information
#
# Table name: users
#
#  id         :bigint(8)        not null, primary key
#  name      :string(255)      not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#
# Indexes
#
#  index_users_on_name    (name) UNIQUE
#

class User < ApplicationRecord
  validates :name, uniqueness: true # 追加
end

ActiveRecord::RecordInvalid が raise されます

sample.rb
User.create!(name: 'Duplication')
User.create!(name: 'Duplication')

=> ActiveRecord::RecordInvalid

注意点

例えば下記のようにユニーク制約に引っかかったときの例外処理を書いているコードがあるときは validates メソッドでユニーク制約をかけると ActiveRecord::RecordNotUnique ではキャッチできなくなるので注意です。

sample.rb
begin
  User.create!(name: 'Duplication')
rescue ActiveRecord::RecordNotUnique
  head :conflict
end
4
1
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
4
1