🤦‍♀️

【Rails & JavaScript】退会機能の実装

2023/08/07に公開

deviseを使用した退会機能を実装していく。
退会確認メッセージのチェックボックスにチェックが入らないと、ボタンがクリックできないようにする。

ルーティング

ルーティングに以下を追記し、退会確認画面と退会処理ができるようにする。

routes.rb
    resources :users, param: :account, only: [:show, :edit, :update] do
      member do
        get :liked_posts
+       get :withdraw_input # 退会確認画面
+       patch :withdraw_process # ステータス更新
      end
    end

モデル

今回は以下のユーザーステータスを設けるため、enumを使用しモデルに記載する。
0 :active (有効ユーザー)
1 :banned (一時凍結)
2 :inactive (退会済み)

また、activeでないユーザーはログインできないように設定する。

app/models/user.rb
:
  enum status: { active: 0, banned: 1, inactive: 2 }
  
 def active_for_authentication?
    super && (status == 'active')
  end
:

superは親クラス(ここではdevise)の同名メソッドを呼び出して実行する。

コントローラ

以下のようにした。
withdraw_inputアクションはどういうページを作るかによってコーディングが変わってくる。

app/controllers/public/users_controller.rb
  def withdraw_input
    @user = current_user
  end
  
  def withdraw_process
    user = current_user
    user.update(status: :inactive)
    reset_session
    redirect_to root_path, notice: "退会しました"
  end

Viewページ

説明項目のみ記載する。

app/views/public/users/withdraw_input.html.erb
:
        <div class="withdraw-checked">
        <label>
          <input type="checkbox" name="withdraw_agreement" id="withdraw-agreement">
          削除する内容を理解した
        </label>
      </div>

      <div class="button">
        <%= link_to "アカウントを削除", withdraw_process_user_path, method: :patch, class: "btn btn-outline-danger", id: "withdraw-button", disabled: true %>
      </div>
    </div>

    <div class="col-md"></div>
  </div>
</div>


<script>
  document.addEventListener("DOMContentLoaded", function() {
    const agreementCheckbox = document.getElementById("withdraw-agreement");
    const withdrawButton = document.getElementById("withdraw-button");

    // ページ読み込み時にボタンの無効化を設定
    withdrawButton.classList.toggle("disabled", !agreementCheckbox.checked);

    // チェックボックスの変更に応じてボタンを制御
    agreementCheckbox.addEventListener("change", function() {
      withdrawButton.classList.toggle("disabled", !agreementCheckbox.checked);
    });
  });
</script>

JavaScriptを使用しチェックボックスにチェックが入らないと、ボタンを無効化する。

チェックが入るとボタンをクリックできるようになる。

Discussion