15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails4.2 で devise + paranoia を使った論理削除後に同じメールアドレスで登録しようとした場合のユニーク制約を回避する方法(案)

Posted at

devise + paranoia を使った論理削除の実装が簡単、かつ便利なわけですが、実装時に参考にした以下のページに、

Rails4+devise+paranoiaで退会ユーザーの論理削除を簡単に実現する

削除済のユーザーと同じemailを登録しようとするとユニーク制約にひっかかり、登録できない

Rails4 + devise + paranoiaで論理削除を考慮したユーザーバリデーションを実現する
これで解決できると思ったら・・・
Rails4.2ではvalidates_uniqueness_of_without_deleted が undefined method になる。。

Issueにもあがってたのね。。
validates_uniqueness_of_without_deleted undefined in Rails 4.2

Rails4.2でユーザーバリデーションを実現する方法はないですかねぇ。。。

とあり困っておりました。

で、結局は destroy 直後にメールアドレスを変更しちゃえばいいんじゃないかと思い立ち、

app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController

...

def destroy

  ...

  resource.destroy

  resource.update(email: resource.deleted_at.to_i.to_s + '_' + resource.email.to_s)

  ...

ってオーバーライドしたらいい感じに動きました。

論理削除後のメールアドレスは [POSIX Time]_[元のメールアドレス] になり、余程の事がなければ衝突はしないだろうし /lib/ 内の devise の元のコード触るのも気が引けたので、むしろこっちのが良いかなと考えています。

15
13
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
15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?