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

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Ruby on RailsでWebアプリケーション開発その34 最後の管理ユーザを削除出来ないようにする

<<前  [TOP]


管理ユーザが一人もいなくなってしまうと管理画面にログイン出来なくなってしまうので、ユーザが最後の一人になったら削除できない設定にします。


まずはuserモデルの編集です。


【app/models/user.rb】

class User < ActiveRecord::Base

	validates :name, presence: true, uniqueness: true
	has_secure_password

  after_destroy :ensure_admin

  private
    def ensure_admin
      if User.count.zero?
        raise "最後のユーザは削除できません。"
      end
    end     

end

「 after_destroy()」というフックメソッドを利用しています。
これによって「delete」が行われると必ず「ensure_admin()」メソッドが呼び出されます。
もしユーザがいなくなったら例外処理されます。


例外処理の記述をusersコントローラのdestroy()メソッドに追記します。


【app/controllers/users_controller.rb】

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  # GET /users
  # GET /users.json
  def index
	@users = User.order(:name)

	respond_to do |format|
	        format.html
		format.json { render ison: @users }
	end
  end

  # GET /users/1
  # GET /users/1.json
  def show
  end

  # GET /users/new
  def new
    @user = User.new
  end

  # GET /users/1/edit
  def edit
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to users_url, notice: "ユーザ名「#{@user.name}」を作成しました。" }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /users/1
  # PATCH/PUT /users/1.json
  def update

	@user = User.find(params[:id])

	respond_to do |format|
		if @user.update(user_params)
			format.html { redirect_to users_url, notice: "ユーザ「#{@user.name}」を更新しました。" }
			format.json { head :ok }
		else
			format.html { render :edit }
			format.json { render json: @user.errors, status: :unprocessable_entity }
		end
	end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
 
    begin
      @user.destroy
      flash[:notice] = "ユーザ「#{@user.name}」を削除しました。"
    rescue Exception => e
      flash[:notice] = e.message
    end

    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:name, :password, :password_digest)
    end
end



destroy()メソッドを抜粋します。

def destroy
 
    begin
      @user.destroy
      flash[:notice] = "ユーザ「#{@user.name}」を削除しました。"
    rescue Exception => e
      flash[:notice] = e.message
    end

    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
    end
end

ユーザを削除した時に例外を発生させ、削除を取り消し、最後のユーザを復元します。
例外はコントローラにエラーを通知し、フラッシュでエラーを表示させます。


f:id:MrRadiology:20180307135921p:plain


一番最初にユーザが一人もいない時は「rails console」コマンドで直接ユーザを追加します。
rails consoleが起動した後「User.create(name: 'consoletest', password: 'test', password_confirmation: 'test')」とコマンド入力しました。
f:id:MrRadiology:20180307141050p:plain
rails consoleを終了するには「exit」と入力します。


ユーザが追加されているか確認してみます。
f:id:MrRadiology:20180307141532j:plain


<<前  [TOP]