何やら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ファイルを追加し、それぞれ下記の内容を記述。
- devise.ja.yml:https://gist.github.com/yhara/606476
- ja.yml:https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml
マイグレーションファイルの内容をデータベースに登録
忘れる前に、マイグレーションを事項して、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
アカウント情報変更完了(ログイン状態)
パスワード忘れ
一通り動作できることを確認。
画面の遷移はこんな感じ。