LoginSignup
24
30

More than 5 years have passed since last update.

deviseのユーザー退会時に論理削除する

Posted at

概要

  • deviseでログイン機能を追加している
  • ユーザー退会時には、userのレコードをすぐに削除するのではなく、leave_atに退会時刻を追加の上、一定期間を置いてから削除する
  • また、退会ユーザーが同メールアドレスで登録する可能性を踏まえ、メールアドレスの頭に文字列を追加する
  • OAuth認証している場合は、uidにも同様の処理をする

コントローラー

registrations_controller.rb
  def destroy
    # userモデルのleaveメソッド
    resource.leave
    Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
    set_flash_message(:notice, :destroyed)
    yield resource if block_given?
    respond_with_navigational(resource){ redirect_to after_sign_out_path_for(resource_name) }
  end

モデル

user.rb
  def leave
    #leave_atに退会時刻を追記
    update_attribute(:leave_at, Time.current)

    # また、userのメールアドレスの頭にleave_atを追加する。
    # メールアドレスを変更すると原則確認メールが送信されるため、
    # 送信をスキップすることを宣言した上でupdateする。
    new_email = self.leave_at.to_i.to_s + '_' + self.email.to_s
    self.skip_reconfirmation!
    update_attribute(:email, new_email)

    # また、social_profilesが存在する場合はuidの頭にもleave_atを追加する
    # fb,twitter両方連携されている場合があるため、each doしている。
    social_profiles = self.social_profiles
    social_profiles.each do |sp|
      new_uid = self.leave_at.to_i.to_s + '_' + sp.uid.to_s
      sp.update_attribute(:uid, new_uid)
    end
  end

参考ページ

下記のページを参考させていただきました。

Deviseにてシステムからユーザーのメールアドレスを変更してもメールを送信しない

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

24
30
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
24
30