概要
業務未経験からITエンジニアへの転職を目指すため、Ruby on Railsを用いてポートフォリオを作成している。
ログイン機能を実装したポートフォリオを作成する場合、機能のほとんどがログインを行わないと使用できないため、機能を確認するためログインをしなければならない(ユーザー名、パスワードを確認するか、新規登録をする)という手間がかかってしまう。
本来、アプリケーションとしては必要ない機能ですが、勉強の一環として、また、自分のポートフォリオを見ていただく際、採用者の方に手間を取らせないために簡単にログインができる機能を実装する。
開発環境
Ruby:2.6.3
Ruby on Rails:5.2.0
説明に入る前に
機能を実装する際、参考にさせて頂いた記事を添付いたします。
・簡単ログイン・ゲストログイン機能の実装方法(ポートフォリオ用)
非常に参考になりました。基本はこちらを参照して頂ければ問題ないと思います。
ありがとうございました。
私の場合、Deviseという機能を使用していなかったため、Deviseを使用しない方法で実装しました。
ユーザーはuser Model、controllerにて処理している前提とします。
1.SessionsControllerを作成
$ rails g controller sessions
上記でSessionsControllerを作成
2.SessionsControllerを編集
class SessionsController < ApplicationController
def create
user = User.find_by(name: params[:name])
if user&.authenticate(params[:password])
session[:user_id] = user.id
redirect_to :root
else
render template: "users/login_form"
end
end
def destroy
session.delete(:user_id)
redirect_to :root
end
# 以下ゲストログイン用アクション
def guest_login
user = User.guest
session[:user_id] = user.id
redirect_to :root, notice: "ゲストユーザーとしてログインしました。"
end
end
create、destroyはログイン機能をsessions controllerで管理する際必要なので記載します。リダイレクト、レンダリング先は任意で設定します。
自分用メモ: &.は左辺オブジェクトがnilの時、nilを返し、nilでない時は右辺のメソッドを呼び出す。
アクション名は任意で設定します。
guestメソッドは次項のUser Modelにて定義します。
3.User Modelを編集
# 省略
def self.guest
find_or_create_by!(name: 'guest') do |user|
user.assign_attributes({
email: "guest@example.com",
birthday: "1990-01-01",
sex: 3})
user.password = SecureRandom.urlsafe_base64
end
end
私の場合、userテーブルにはいくつかのカラムがあるのでguestログインする際、様々な情報をassign_attributesを使って埋め込んでいます。
特に必要なければ省略可能です。
4.ルーティングの設定
# 省略
resource :session, only: [:create, :destroy] do
post "guest_login", on: :collection
end
guest_loginへのルーティングを設定します。
5.リンクの作成
<%= link_to "簡易ログイン", :guest_login_session, method: :post %>
必要箇所に上記を埋め込みます。
まとめ
以上で簡易ログイン機能は実装できます。
ポイントは3.項のfind_or_create_by!です。
引数nameから'guest'を探し、該当するデータがあればそれを返し、なければ新たに作成ができます。このように設定すれば、guestユーザーを削除されて場合でも、再び'guest'としてログインができます。
私はある程度、アプリケーションを作成してから追加で導入したため、説明が抜けている場面もあるとは思います。不備がございましたら申し訳ございません。
私が参照させて頂いた記事やその他記事を参考に自分に合った方法にて実装して頂けると幸いです。
最後に余談
この記事が初投稿となりますが、記事を書く際、改めて言葉の意味など再確認する機会が多く、非常に勉強となりました。
覚えたことを発信することでより理解が深まるということを再確認しました。
今後は、勉強もそうですが、投稿も頑張っていきたいと思います。