0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【コア機能】SessionsController作成・ログイン画面実装

Posted at

前章ではメイン画面で使用するための
「[従業員][コース][配達先]を呼び出して、配達登録をできる様にDeliveriesController」を作成しました。
しかし、このメイン画面に到達するまでに

「ログイン画面で従業員を認識する」

「コースを選択する」

という2画面が必要なため、
つぎはログイン画面に必要な[SessionsController]を作成し、ビューも簡単に作成していきます。

Point

  • SessionsControllerはログイン・ログアウト専用
  • Railsは「1テーブルに1コントローラー」又は「1画面・1機能に1コントローラー」

目次

  • 1.手順1SessionsController作成
  • 2.手順2new/create/destroy処理を実装(SessionsController.rb)
  • 3.手順3ルート設定(routes.rb)
  • 4.手順4ビュー作成(app/views/sessions/new.html.erb)
  • 5.HTTPメソッド・アクション・ビュー対応表

今回作業する完成後の流れ(login認証)
👩‍💻 ユーザー
↓(ブラウザで /login にアクセス)
🗺️ ルート(routes.rb)
↓(sessions#create に指示)
🧠 コントローラー(sessions_controller.rb)
↓(Employee モデルに問い合わせ)
🗄️ モデル(employee.rb + DB)
↓(結果を返す)
🧠 コントローラー(結果を判断)
🎨 ビュー(HTMLを返す)
🌐 ユーザーに画面が表示!

SessionControllerで実行できること

アクション 内容 画面
new ログイン画面を表示 Employee No. 入力欄がある画面
create 入力された社員番号を検証してセッション開始 ログイン成功 → Deliveries#newへ遷移
destroy ログアウト処理 ログイン画面に戻る

手順1 SessionsController作成

rails g controller sessionsコマンド実行後、以下のファイルが自動生成される。
(Railsのバージョンによって若干違う様です)

create app/controllers/sessions_controller.rb
create app/views/sessions
create app/helpers/sessions_helper.rb

手順2 new/create/destroy処理を実装

app/controllers/sessions_controller.rbにnew/create/destroy処理を実装します。

new

  def new
  end

ログイン画面(フォーム)を表示するだけ。
新しくDBに行を作成するわけでは無いため無記載。

createログインを押したら呼ばれる

  def create
    employee = Employee.find_by(employee_no: params[:employee_no])
    if employee
      session[:employee_id] = employee.id
      redirect_to new_delivery_path, notice: "ログインしました。"
    else
      flash.now[:alert] = "社員番号が正しくありません。"
      render :new, status: :unprocessable_entity
    end
  end

employee = Employee.find_by(employee_no: params[:employee_no])
→Employee モデルのテーブルから、employee_noがフォームで送られてきた値params[:employee_no]と一致するレコードを探す。
該当社員が見つかれば、その社員情報を employee に代入。

destroyログアウト担当

  def destroy
    session.delete(:employee_id)
    redirect_to login_path, notice: "ログアウトしました。"
  end

session.delete(:employee_id)
→ログイン時に作った session[:employee_id] を削除。
これによって、「今ログインしている社員の情報」がなくなり、ログイン状態が解除される。
redirect_to login_path,
→ログアウトが完了したあと、ログイン画面 (sessions#new) に戻る。

手順3 ルート設定

routes.rbにログイン画面用のルーティングを記述する。

Rails.application.routes.draw do
  get 'login', to: 'sessions#new'  # ログイン画面(表示)
  post 'login', to: 'sessions#create'  # ログイン処理(フォーム送信)
  delete 'logout', to: 'sessions#destroy'  # ログアウト処理
end

定番の型なので覚えてしまう。

===

HTTPメソッド どれに何を使用するか?覚える。

メソッド 意味 例(Railsのアクション対応) 使われる場面
GET 取得する(見るだけ) index, show, new, edit ページを表示したい時
POST 新しく作る(登録) create フォーム送信(新規作成)
PATCH / PUT 更新する update 既存のデータを変更
DELETE 削除する destroy データを消す(ログアウトなど)

===

手順4 ビューの作成(app/views/sessions/new.html.erb)

なぜこのファイルを作成するか?
routes.rbでget 'login', to: 'sessions#new'と記載があるため、
ブラウザで /login にアクセスすると Rails は自動的に
app/views/sessions/new.html.erbを探す。

つまりこのファイルが ログイン画面(フォーム) になる。

<h1>ドライバーログイン</h1>

<%= form_with url: login_path, method: :post, local: true do |form| %>
  <div>
    <%= form.label :employee_no, "社員番号" %>
    <%= form.number_field :employee_no, required: true %>
  </div>

  <div>
    <%= form.submit "ログイン", class: "btn btn-primary" %>
  </div>
<% end %>

<% if flash[:alert] %>
  <p style="color: red;"><%= flash[:alert] %></p>
<% end %>

ここで、ログイン画面を最初のアクセスできる画面に設定したいので、
routes.rbに以下の1行を追加しています。

  root to: 'sessions#new' # ホーム画面をログイン画面に設定

このままでは従業員コードを入力してログインボタンを押しても、
処理は実行できても次の画面のビューが存在しないため何も起こりません。
次の章でapp/views/deliveries/new.html.erbを作成します。

HTTPメソッド・アクション・ビュー対応表

アクション名 HTTPメソッド パス(URL例) 役割(主な処理) 対応ビュー 説明
index GET /deliveries 一覧表示 index.html.erb 登録済みの全データを一覧で見せる
show GET /deliveries/:id 詳細表示 show.html.erb 特定の1件を表示
new GET /deliveries/new 新規登録フォーム表示 new.html.erb 空のフォームを表示(入力画面)
create POST /deliveries 新規登録処理 なし(成功時はリダイレクト) フォームから送信された内容をDBに保存
edit GET /deliveries/:id/edit 編集フォーム表示 edit.html.erb 既存データをフォームに表示
update PATCH / PUT /deliveries/:id 編集内容の更新処理 なし(成功時はリダイレクト) 入力された内容でDBを更新
destroy DELETE /deliveries/:id 削除処理 なし データを削除(確認後に実行される)

覚えておくべきポイント

表示系(GET) → index, show, new, edit

処理系(POST/PATCH/DELETE) → create, update, destroy

処理系アクションはビューを持たず、成功時は redirect_to で別の画面に遷移


私のオリジナルプロダクト「Logi-Balance]に関して、
要件定義書や画面遷移図等を以下のGitHub上で公開しております。
GitHub

注意
私はプログラミング学習歴1年未満の初学者です。
この記事は自身の備忘録用として掲載しております。
間違いがあるかと思いますので、今後の学習のためにコメントにご指摘を頂けますと幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?