Railsのシンプルなログイン機能 Part1
目次
はじめに
ログイン機能の勉強として機能を細分化しつつ実装します。今回はユーザーをデータベースに登録し、ユーザーの一覧を表示されるところまで。
理解するための実装なので設計上好ましくない実装が含まれます。できるだけシンプルに実装し、理解し易さを求めたので今回のような実装になりました。ないとは思いますが、後述するコードを参考にする際はお気をつけください。
- 環境
バージョン | |
---|---|
OS | OS X 10.15.6 |
ruby | 2.6.4 |
rails | 6.0.3 |
設計
- データベース
カラム | 用途 | データ型 |
---|---|---|
id | 自動生成のID | integer |
name | ユーザーネーム | string |
password | パスワード | string |
機能
ユーザー登録
ユーザー一覧表示
ここでは、ユーザーを登録して、ユーザー一覧を表示するだけです。
ユーザー削除やユーザー編集、認証機能はここでは実装しません。ビュー
ファイル名 | 内容 |
---|---|
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
- 今回の設計要件は以上で満たしました。
まとめ
以上で、ユーザー登録とユーザー一覧表示の機能は実装できました。ただ、これだけ質素な機能でも考慮すべき点がいくつもあります。
- 登録情報のバリデーション
- パスワードを保存する際の暗号化
- ユーザー一覧のページネーション
- エラー処理
今の登録情報は名前とパスワードですが認証機能がないので、ただuserテーブルの”name”と”password”というカラムにデータを保存しているだけの状態です。ログイン機能を実装するには次の項目も実装する必要があります。
- ユーザー削除
- ユーザー編集
- 認証機能
- リファクタリング(フォームヘルパーやパーシャルの活用)
- RESTfullなルーディング
上記の項目を追加してやっと”ただのログイン機能”が実装できます。これに加えてユーザーの投稿やいいね機能などSNSの基本的な機能を追加してやっとアプリケーションらしくなっていきます。いきなりは難しいので徐々に機能追加していきたいと思います。