↓↓クリックして頂けると励みになります。
ユーザーを全て削除してしまうと色々と不都合が生じてしまう場合があります。
そのようなときはコマンドラインからユーザを追加することもできます。
ターミナルで「rails console
」と入力し、「User.create(name: 'administrator', password: 'admin', password_confirmation: 'admin')」などとしてユーザを追加します。
最後のユーザを削除できないよう、「users_controller.rb」の「destroy()」メソッドを編集します。
記述編集 【SampleCart/app/controllers/users_controller.rb】54行目
class UsersController < ApplicationController skip_before_action :authorize, only: [:new, :create] before_action :set_user, only: %i[ show edit update destroy ] # GET /users or /users.json def index @users = User.order(:name) end # GET /users/1 or /users/1.json def show end # GET /users/new def new @user = User.new end # GET /users/1/edit def edit end # POST /users or /users.json def create @user = User.new(user_params) respond_to do |format| if @user.save format.html { redirect_to markets_index_url, notice: "ユーザ #{@user.name}を作成しました。" } format.json { render :show, status: :created, location: @user } else format.html { render :new, status: :unprocessable_entity } format.json { render json: @user.errors, status: :unprocessable_entity } end end end # PATCH/PUT /users/1 or /users/1.json def update respond_to do |format| if @user.update(user_params) format.html { redirect_to markets_index_url, notice: "ユーザ #{@user.name}を更新しました。" } format.json { render :show, status: :ok, location: @user } else format.html { render :edit, status: :unprocessable_entity } format.json { render json: @user.errors, status: :unprocessable_entity } end end end # DELETE /users/1 or /users/1.json def destroy if User.count == 1 redirect_to users_url, notice: "最後のユーザーは削除できません。" else @user.destroy! respond_to do |format| format.html { redirect_to markets_index_url, notice: "ユーザーを削除しました。" } format.json { head :no_content } end end end private # Use callbacks to share common setup or constraints between actions. def set_user @user = User.find(params[:id]) end # Only allow a list of trusted parameters through. def user_params params.require(:user).permit(:name, :password, :password_confirmation) end end
合わせてビューも整えます。
「SampleCart/app/views/users/index.html.erb」ファイルを以下の様に編集します。
記述編集 【SampleCart/app/views/users/index.html.erb】
<div class="container mt-4"> <div class="h4"> <strong>登録ユーザー</strong> </div> <div class="mt-4"> <%= link_to "新規登録", new_user_path, class: "btn btn-primary" %> </div> <div id="users"> <ul class="list-group mt-4"> <% @users.each do |user| %> <li class="list-group-item p-3"> <div class="row"> <div class="col-10"> <span class="badge bg-secondary">ユーザ名</span> <strong><%= user.name %></strong> </div> <div class="col-1"> <%= link_to "詳細", user, class: "btn btn-warning" %> </div> <div class="col-1"> <%= button_to "削除", user, method: :delete, class: "btn btn-danger", data: { turbo: false }, form: { onSubmit: "return check()" } %> </div> </div> </li> <% end %> </ul> </div> </div> <script> function check(){ if(window.confirm('本当に削除しますか?')){ return true; } else{ window.alert('キャンセルされました'); return false; } } </script>
ブラウザを確認します。
http://localhost:3000/users/
これで登録ユーザーが最後の1人になった場合、削除できない様になっています。
動作を確認してください。
最後にナビゲーションバーのリンクを整えます。
「SampleCart/app/views/shared/_navbar.html.erb」ファイルの11行目と23行目の記述を変更しています。
記述変更 【SampleCart/app/views/shared/_navbar.html.erb】11,23行目
<nav class="navbar navbar-expand-lg bg-body-tertiary"> <div class="container-fluid"> <a class="navbar-brand" href="/">Smple Cart</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav me-auto mb-2 mb-lg-0"> <!-- もしログインしていなかったら--> <li class="nav-item" style="margin-bottom: 0.1rem;"> <span style="margin-left: 3rem;"><%= link_to "新規登録", new_user_path, class: "btn btn-danger text-light" %></span> </li> <li class="nav-item"> <span style="margin-left: 3rem;"><%= link_to "ログイン", login_path, class: "btn btn-success text-light" %></span> </li> </ul> <ul class="navbar-nav mr-auto w-25"> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"> ドロップダウン </a> <ul class="dropdown-menu"> <li><%= link_to "登録ユーザ 一覧", users_path, class: "dropdown-item btn btn-light" %></li> <li><hr class="dropdown-divider"></li> <li><%= link_to "ログアウト", logout_path, class: "dropdown-item btn btn-light" %></li> </ul> </li> </ul> </div> </div> </nav>
↓↓クリックして頂けると励みになります。