プログラミング備忘録

プログラミングの学習状況をメモしています

48日目

今日の学習

Ruby on Rails

Railsチュートリアル 第8章

railstutorial.jp

この章では、ユーザーがログインやログアウトができるように、ログインの基本的な仕組みを実装していくようだ。

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 %>