学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Rails導入編 | カート機能の実装 | 25 | ユーザー管理

↓↓クリックして頂けると励みになります。



24 | ログイン】 << 【ホーム





ユーザーを全て削除してしまうと色々と不都合が生じてしまう場合があります。
そのようなときはコマンドラインからユーザを追加することもできます。
ターミナルで「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>


ナビゲーションバーのリンクを変更
ナビゲーションバーのリンクを変更




24 | ログイン】 << 【ホーム






↓↓クリックして頂けると励みになります。