<<前 [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
ユーザを削除した時に例外を発生させ、削除を取り消し、最後のユーザを復元します。
例外はコントローラにエラーを通知し、フラッシュでエラーを表示させます。
一番最初にユーザが一人もいない時は「rails console
」コマンドで直接ユーザを追加します。
rails consoleが起動した後「User.create(name: 'consoletest', password: 'test', password_confirmation: 'test')
」とコマンド入力しました。
rails consoleを終了するには「exit
」と入力します。
ユーザが追加されているか確認してみます。
↓↓クリックして頂けると励みになります。