subtitle

RaiseTechの各種コースをはじめとしたイロイロな学習の記録

Railsでログイン認証機能を実装してみる(devise)

何やらRailsには、deviseというログイン認証機能を簡単に実装できるgemが存在するらしいので使ってみる。


インストール

プロジェクトフォルダの直下にあるGemfileにインストールするgem(今回はdevise)を記載する。(Gemfileについては、こちらの記事参照。)

gem 'devise'

Gemfileを記述したら、ターミナルでgem installコマンドを叩く。

Gemfile.lockを見ると、deviseの最新版のインストールと、deviseと依存関係のあるgemのバージョンが更新されていることが分かる。


次は、deviseの設定ファイルをRailsアプリにインストールするコマンドをターミナルで叩く。

rails g devise:install

ターミナルに表示された指示の通りに設定していく。


えーと、なになに。

config/environments/development.rb に、default_url_optionsを設定。(必須)

それっぽいところに、例に記載されているように追加。今回はローカル環境でやるので、例の通りでOK。Webサーバー立ててやるなら、そのIPアドレスを設定することになるはず。


config/routes.rb に、ルーティングを施す。(必要に応じて)

これはすでに対応済みなので、新たに対応は不要。


app/views/layouts/application.html.erb に、flashメッセージを追加。(必要に応じて)

フラッシュメッセージとは、deviseの場合はログインできたときに「ログインに成功しました」的なメッセージが表示されるヤツのことらしい。

bodyの中に入れる。


ビューをカスタマイズする場合は、ターミナルでrails g devise:views コマンドを実行する。(やりたい人だけ)

このコマンドを打つと、色々ビューをカスタマイズできるようなので、実行。

なんかいろいろできた。


ここまでで、1~4までの指示に対する対応が完了。


deviseのユーザーモデルを作る

認証できるモデルを作成するために、ターミナルで下記のコマンドを叩く。今回はモデル名は「user」にする。

rails g devise user

ところで、通常のモデルを作るコマンドは、

rails g model [モデル名]

なので、間違えないように注意。

なんかいろいろできた。


認証に使うためのマイグレーションファイルができていて、ルーティングも追加されている模様。

config/routes.rb:devise用のルーティングが追加されている。


db/migrate/20210206123605_devise_create_users.rb:マイグレーションファイルには、deviseで定義されているモジュールが記載されている。


  • Database authenticatable:パスワード認証と暗号化
  • Recoverable:パスワードリセット
  • Rememberable:Cookieからユーザーを記憶するためのトークン生成とクリア
  • Trackable:ログイン回数、最終ログイン日時などの情報を保持
  • Confirmable:新規登録時のメール認証
  • Lockable:アカウントロック

下の3項目はコメントアウトされているので、デフォルトでは無効。


app/models/users.rb:deviseで使用するモジュールが記載されたファイルが追加



viewの下にも、色々フォルダが追加されているので、認証用のファイルが色々生成されていることが分かる。

この下のファイルを変えれば、見た目が色々変えられるはず。



deviseの言語を日本語にする

deviseは英語表記なので、フラッシュメッセージなどが日本語になるように設定する。

config/application.rb に「config.i18n.default_locale = :ja」と記載する。


config/localesフォルダに、devise.ja.ymlとja.ymlの2ファイルを追加し、それぞれ下記の内容を記述。


マイグレーションファイルの内容をデータベースに登録

忘れる前に、マイグレーションを事項して、DBに登録。

rails db:migrate

補足:

マイグレーションを忘れると、画面表示したときに下記のようなエラーが出る。



ビューの編集

app/views/layouts/application.html.erb をにログイン認証機能用のヘッダを追加する。

このファイルに記述することによって、全てのページのヘッダ部分にログイン認証機能表示が表示されるようになる。

先ほどbodyの中に入れたフラッシュメッセージの上あたりに下記のコードを入れる。

 <header>
    <nav>
        <% if user_signed_in? %>
        <%= link_to '登録内容変更', edit_user_registration_path %>
        <%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
    <% else %>
        <%= link_to '新規登録', new_user_registration_path %>
        <%= link_to 'ログイン', new_user_session_path %>
        <% end %>
    </nav>
  </header>


ログイン認証してみる

細かいところはさておき、一通りログイン認証機能を実装したので、表示させてみる。

ターミナルで、rails sコマンドでサーバーを立ち上げたらトップページを表示させる。

ヘッダ部分に「新規登録」と「ログイン」のリンクができた。(意図通り)


新規登録をクリックして、Eメールとパスワードを入力 > Sign up


アカウント登録完了(ログイン状態)


ログアウトをクリック


ログインをクリックして、先ほど登録したEメールとパスワードを入力 > Log in


ログイン完了(ログイン状態)


登録内容変更(メールアドレスを変更する) > update


アカウント情報変更完了(ログイン状態)


パスワード忘れ


一通り動作できることを確認。


画面の遷移はこんな感じ。