48日目
今日の学習
Ruby on Rails
Railsチュートリアル 第8章
この章では、ユーザーがログインやログアウトができるように、ログインの基本的な仕組みを実装していくようだ。
(Railsチュートリアルでの)ログインの基本的な仕組みとは、ブラウザがログインしている状態を保持し、ユーザーによってブラウザが閉じられたら状態を破棄するといった仕組み(認証システム(Authentification System)
ログインしているユーザーだけがアクセスできるページや、使える機能を制御する仕組みのことを認可モデル(Authorization Model)
と呼ぶ。
過去に作成したことがある、ログインの有無でヘッダーの内容を変えたりする仕組みもこれに当てはまるらしい。
セッション
Rails 6 でプロダクト開発を学ぼう - Railsチュートリアル
HTTP
は、ステートレス(Stateless)
なプロコトル。これは何を指しているのかというと、リクエストが終わるとこれまでのリクエストを全て忘れ、次回はまた最初からやり直すという健忘症的なプロコトルであることを指す。
そのため、ブラウザであるページから別のページに移動した時、ユーザーIDを保持しておく手段がHTTPプロコトル
には無いらしい。
ユーザーログインが必要なWebアプリケーションでは、セッション(Session)
と呼ばれる半永続的な接続を、コンピュータ間に別途設定しておく。
ネットを見ているとたまにセッションが切れました〜的なエラーを目にすることがあるが、この意味のセッションだったのだろう。
Railsでセッションを実装する方法として最も一般的なものが、cookies
を使う方法らしい。意味は知らないがこれまでに何度も見たことのある単語だ。
cookie
とは、ユーザーのブラウザに保存される小さなテキストデータとのこと。あるページから別のページに移動した時に破棄されないため、ユーザーIDなどの保持すべき情報を保存することができる。
第8章では、ひとまずsession
というメソッドを使って一時セッションを作成し、cookies
メソッドを使った長続きするセッションは第9章で学習するようだ。
Sessionsコントローラ
セッション
をRESTful
なリソースとしてモデリングすることで、仕組みへの理解がしやすくなる。
- ログインページでは
new
で新しいセッションを出力 - そのページでログインし、
create
でセッションを保存 - ログアウトすると
destroy
でセッションを破棄
Usersリソースとの違いは、データベース上の永続的データにアクセスするのに対してSessionリソースではcookies
を保存場所として使う。
まずはコマンドでSessionsコントローラを生成(newはビューファイルも欲しい)。
rails g controller Sessions new
必要なルーティングは、ログインするためのページを取得するget
、ログイン情報を送信するためのpost
、ログアウトするときのdelete
メソッドとパスだけなので、resources
ではなく以下の三つを設定する。
get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy'
セッションフォーム
ユーザー登録フォームと違うところは多々あるが、最大の違いは、セッションにはSessionモデルがなく、@user
のようなインスタンス変数に相当するものもないという点。
# 新規登録フォーム <%= form_with(model: @user, local: true) do |f| %> # セッションフォーム <%= form_with(url: login_path, scope: :session, local: true) do |f| %>
ログイン時に必要な情報は、メールアドレスとパスワードの二つだけなので、以下のような形になる。
<%= form_with(url: login_path, scope: :session, local: true) do |f| %> <%= f.label :email %> <%= f.email_field :email, class: "form-control" %> <%= f.label :password %> <%= f.password_field :password, class: "form-control" %> <%= f.submit "Log in", class: "btn btn-primary" %> <% end %>