概要
- 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 を使った論理削除後に同じメールアドレスで登録しようとした場合のユニーク制約を回避する方法(案)