前章ではメイン画面で使用するための
「[従業員][コース][配達先]を呼び出して、配達登録をできる様に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年未満の初学者です。
この記事は自身の備忘録用として掲載しております。
間違いがあるかと思いますので、今後の学習のためにコメントにご指摘を頂けますと幸いです。