ゲストログイン機能
ゲストログイン機能の作成
Deviseではsign_inというメソッドが存在しており、これはユーザーをログイン状態にするものです。
あとは、どのユーザーをログイン状態にするべきか、というところで、ゲスト用のユーザーを作成した上でログインさせます。
通常のログイン機能はsessions_controller.rbに記述されています。※これはGemでインストールされているため、アプリケーションのディレクトリツリーからは確認できません。
今回はゲストログイン用に独自のメソッドを作成したいためDeviseのsessions_controller.rbの機能を継承して実装します。
sessions_controller.rbには次のように記述します。
def guest_sign_in
user = User.guest
sign_in user
redirect_to root_path, notice: "ゲストユーザーとしてログインしました。"
end
※ User.guestのguestメソッドは後ほど作成します。
sign_in userでは、ゲストユーザーをログイン状態にします。
作成したcontrollerへ処理を行うためのルーティングを設定します。
devise_scope :user do
post 'users/guest_sign_in', to: 'public/sessions#guest_sign_in'
end
rails routesコマンドで確認すると、users_guest_sign_in_pathで先程作成したコントローラーのアクションへ処理をつなげることがわかります。
users_guest_sign_in POST /users/guest_sign_in(.:format)
public/sessions#guest_sign_in
user.rbにapp/controllers/users/sessions_controller.rbで記述したUser.guestのguestメソッドを定義します。
GUEST_USER_EMAIL = "guest@example.com"
def self.guest
find_or_create_by!(email: GUEST_USER_EMAIL) do |user|
user.password = SecureRandom.urlsafe_base64
user.name = "ゲストユーザー"
end
end
find_or_create_byとは?
find_or_create_byは、データの検索と作成を自動的に判断して処理を行う、Railsのメソッドです。
具体的には、find_or_create_by(条件)の条件としたデータが存在するかどうかを判断した上で
・存在する場合には、そのデータを返す
・存在しない場合は、新規作成する
という判断と処理を行います。
また、find_or_create_by!の「!」を付与することで、処理がうまくいかなかった場合にエラーが発生するようになり、結果不具合を検知しやすくなります。
SecureRandom.urlsafe_base64とは?
SecureRandom.urlsafe_base64は、ランダムな文字列を生成するRubyのメソッドの一種です。
パスワードはSecureRandom.urlsafe_base64でランダムな文字列にすることができます。
またnameは"guestuser"と固定しています。
このようにすることで、Userモデルで使用できるメソッドとしてUser.guestの記述が可能になります。
機能部分の作成は完了しました。
次はトップページにゲストログインボタンを配置します。
ゲストログインボタンを配置する
配置したいところに配置
今回はログイン画面に追加
<h5 class="mt-5">ゲストログインはこちらから</h5>
<div class="col mb-3 mt-3">
<%= link_to "ゲストログイン(閲覧用)", users_guest_sign_in_path, class: "btn btn-secondary", method: :post %>
</div>
Discussion