[Rails] 退会機能(論理削除)
ポートフォリオに実装した退会機能のメモです。
実装
Userモデルにカラムを追加
Userが退会済みかどうかを判断するためのbooleanカラムを追加していきます。
ちなみにUserモデルはdevise
で追加したことを想定しています。
rails g migration AddIsValidToUsers is_valid:boolean
class AddIsValidToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :is_valid, :boolean, default: true, null: false
end
end
rails db:migrate
退会処理
退会画面と退会処理を作っていきます。
get '/accounts/:id/unsubscribe' => 'accounts#unsubscribe', as: 'unsubscribe'
patch '/accounts/:id/withdrawal' => 'accounts#withdrawal', as: 'withdrawal'
退会画面を表示する画面用のgetリクエストのunsubscribe
と先程作成したUserカラムのbooleanを更新するpatchリクエストのwithdrawal
のルーティングを作ります。
続いてController
def unsubscribe
@user = User.find(params[:id])
end
def withdrawal
@user = User.find(params[:id])
@user.update(is_valid: false)
reset_session
flash[:notice] = "退会処理を実行いたしました"
redirect_to root_path
end
unsubscribe
ではuser_id
を取得
withdrawal
では退会のためのbooleanを更新して退会したらroot_pathに飛ばしているだけです。
次にviewです。
.container
%h2 退会お手続き
%p
退会手続きをされますと、全てのサービスがご利用いただけなくなります。
%br
再度ご利用をいただく場合には、新規登録のお手続きが必要になります。
%br
本当に退会してよろしいですか?
= link_to "退会する", withdrawal_path, method: :patch, data: { confilm: "本当に退会しますか?" }
= link_to "退会しない", root_path
退会するを押したらlink_toで先程のControllerのwithdrawal
アクションに飛んでbooleanを更新する流れです。
退会ユーザーはログインできなくする
退会したらログインできなくしていきます。
def active_for_authentication?
super && (is_valid == true)
end
モデルに制約を設定します。
class Users::SessionsController < Devise::SessionsController
protected
def reject_user
@user = User.find(params[:id])
if @user
if @user.valid_password?(params[:user][:password]) && (@user.active_for_authentication? == true)
redirect_to new_user_registration
end
end
end
end
Controllerで退会済みUserはログインできなくしていきます。
valid_password?
でパスワードが正しいかどうか、
active_for_authentication? == true
で先程設定したモデルの制約がtrueの場合はログインせずログインページにリダイレクトされるようにしています。
これで完成です。
参考
Author And Source
この問題について([Rails] 退会機能(論理削除)), 我々は、より多くの情報をここで見つけました https://qiita.com/aaaasahi_17/items/0d3aff0833e37fb70d13著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .