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

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

Ruby on Rails 6.0によるWebアプリケーション開発34 管理機能の追加

<<前  [TOP]


レイアウトのサイドバーに各種機能に対するリンクを追加します。
「session」に「:user_id」がある場合のみ表示されるようにします。


【C:\Rails6\work\shop\app\views\layouts\application.html.erb】

<!DOCTYPE html>
<html>
  <head>
    <title>Railsはじめてマート オンラインストア</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
	<header class="main">
		<%= image_tag 'logo.png', alt: 'Railsはじめてマート',  width: 80 %>
	</header>
	<section class="content">
		<nav class="side_nav">
			<div id="cart" class="carts">
				<%= render_if @cart && @cart.line_items.any?, @cart %>
			</div>
			<ul>
				<li><a href="/">ホーム</a></li>
				<li><a href="/questions">質問</a></li>
				<li><a href="/news">ニュース</a></li>
				<li><a href="/contact">問い合わせ</a></li>
			</ul>

		        <% if session[:user_id] %>
         		 <nav class="logged_in_nav">
           			 <ul>
           			   <li><%= link_to '注文一覧',   orders_path   %></li>
           			   <li><%= link_to '商品登録', goods_path %></li>
             		           <li><%= link_to 'ユーザ管理',    users_path    %></li>
           			   <li><%= button_to 'ログアウト', logout_path, method: :delete   %></li>
           			 </ul>
          		</nav>
        	       <% end %>
		</nav>
		<main class='<%= controller.controller_name %>'>
		    <%= yield %>
		</main>

	</section>
  </body>
</html>



ブラウザの表示確認
ブラウザの表示確認


管理者を全て削除してしまうとログインできなくなり、ユーザの追加もできなくなってしまいます。
そのようなときはコマンドラインからユーザを追加します。
コマンドプロンプトで「rails console」と入力し、「User.create(name: 'administrator', password: 'admin', password_confirmation: 'admin')」としてユーザを追加します。
コマンドラインからユーザの追加
コマンドラインからユーザの追加


最後のユーザを削除しようとした時にエラーを出すように「user.rb」モデルに「ensure_an_admin_remains()」メソッドを追加します。


【C:\Rails6\work\shop\app\models\user.rb】

class User < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  has_secure_password

  after_destroy :ensure_an_admin_remains

  class Error < StandardError
  end

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

end



「users_controller.rb」の「destroy()」メソッドの下に例外処理を生成する記述を追加します。


【C:\Rails6\work\shop\app\controllers\users_controller.rb】

  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'ユーザを削除しました。' }
      format.json { head :no_content }
    end
  end

  rescue_from 'User::Error' do |exception|
    redirect_to users_url, notice: exception.message
  end



これで最後のユーザを削除しようとしても削除できないようになりました。

ブラウザの表示
ブラウザの表示


<<前  [TOP]