概要
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