Railsのシンプルなログイン機能 Part1

目次

はじめに

ログイン機能の勉強として機能を細分化しつつ実装します。今回はユーザーをデータベースに登録し、ユーザーの一覧を表示されるところまで。

理解するための実装なので設計上好ましくない実装が含まれます。できるだけシンプルに実装し、理解し易さを求めたので今回のような実装になりました。ないとは思いますが、後述するコードを参考にする際はお気をつけください。

  • 環境
バージョン
OS OS X 10.15.6
ruby 2.6.4
rails 6.0.3

設計

  • データベース
カラム 用途 データ型
id 自動生成のID integer
name ユーザーネーム string
password パスワード string
  • 機能

    1. ユーザー登録

    2. ユーザー一覧表示

    ここでは、ユーザーを登録して、ユーザー一覧を表示するだけです。
    ユーザー削除やユーザー編集、認証機能はここでは実装しません。

  • ビュー

ファイル名 内容
index.html.erb ユーザー一覧
new.html.erb 登録画面

実装

  • 新しいRailsアプリを作成。
$ rails new simple_login

gem annotate を追加。(annotateの追加方法)

  • modelとデータベース作成

下記コマンドでユーザーモデルを作成。

$ rails g model User name:string password:string

下記コマンドでデータベースを作成。

$ rails db:migrate
  • controller作成
$ rails g controller Users index new create
  • ルーティング設定

コントローラーを作成した際に生成されたroutes.rbを次のように書き換える。

Rails.application.routes.draw do
  get 'users/index'
  get 'users/new'
  post 'users/create'

  root 'users#index'
end

Usersコントローラーのcreateメソッドはユーザー登録のメソッドなのでgetからpostに変更する。また、ルートへのパスをユーザー一覧画面であるindexに変更する。

  • viewの編集

① 登録画面( new.html.erb )

基本的にはよくあるHTMLのフォームです。4行目はPOSTリクエストを送るためのRailsのおまじないだと思ってください(CSRF保護を通過するためらしいです)。

<h1>ユーザー登録</h1>
<%= link_to 'ユーザー一覧', '/users/index' %>
<form action="/users/create" method="post">
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
  <ul>
    <li>
      <label for="user_name">Name:</label>
      <input type="text" id="user_name" name="user[name]">
    </li>
    <li>
      <label for="user_password">Password:</label>
      <input type="password" id="user_password" name="user[password]">
    </li>
    <li>
      <input type="submit" value="登録">
    </li>
  </ul>
</form>

② ユーザー一覧 ( index.html.erb )

<h1>ユーザー一覧</h1>
<%= link_to '登録画面へ', '/users/new' %>
<table>
  <tr>
    <th>ユーザー名</th>
  </tr>

  <% @users.each do |user| %>
  <tr>
    <td><%= user.name %></td>
  </tr>
  <% end %>
</table>
  • controllerの編集

① indexメソッド

登録されているユーザーをUser.allで全て取得してindexビューに渡します。

② newメソッド

newビューを表示するだけなので何も記述しません。

③ createメソッド

フォームのページからのparamsをプライベートクラスに渡しuserに関するものだけにします。それを元にUser.new(user_params)でフォームから送られてきたnameとpasswordで新しいオブジェクトを作成します。そのオブジェクトをインスタンス変数@userに代入します。インスタンス変数@userをsaveメソッドでデータベースに保存します。最後にユーザー一覧にリダイレクトします。

class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def new
  end

  def create
    @user = User.new(user_params)

    @user.save
    redirect_to '/users/index'
  end

  private
    def user_params
      params.require(:user).permit(:name, :password)
    end
end
  • 今回の設計要件は以上で満たしました。

まとめ

以上で、ユーザー登録とユーザー一覧表示の機能は実装できました。ただ、これだけ質素な機能でも考慮すべき点がいくつもあります。

  1. 登録情報のバリデーション
  2. パスワードを保存する際の暗号化
  3. ユーザー一覧のページネーション
  4. エラー処理

今の登録情報は名前とパスワードですが認証機能がないので、ただuserテーブルの”name”と”password”というカラムにデータを保存しているだけの状態です。ログイン機能を実装するには次の項目も実装する必要があります。

  1. ユーザー削除
  2. ユーザー編集
  3. 認証機能
  4. リファクタリング(フォームヘルパーやパーシャルの活用)
  5. RESTfullなルーディング

上記の項目を追加してやっと”ただのログイン機能”が実装できます。これに加えてユーザーの投稿やいいね機能などSNSの基本的な機能を追加してやっとアプリケーションらしくなっていきます。いきなりは難しいので徐々に機能追加していきたいと思います。

参考文献

Ruby on Rails ガイド