🔑

[開発スキルアップ]ゲストユーザーログイン

2024/06/09に公開

なぜ必要か?

自身のポートフォリオであるWebアプリケーションを利用してもらいやすくする為
ゲストログイン機能は、サービスに登録前に試しに使ってもらいたい時や、ECサイトで会員登録をせずに商品を購入するときに使用
機会損失を避けるためと言っていいでしょう。

🥴 {実装する上でのpoint

1,ゲストログインユーザーはプロフィール編集画面への遷移ボタンを配置しない
2,ゲストログインユーザーはプロフィール編集画面に遷移できない(URL直接入力を含む)

何故?

▶︎ゲストユーザーを設定する時にname等をあらかじめ決めておくため、
 あとから変更を加えられるとログインできなくなってしまうからです。


必須条件

deviseを実装済みであること。


まずはゲストログイン機能を実装する

通常のログイン機能はsessions_controller.rbに記述されているがgemの機能だからアプリケーションからは見ることができない😴

⭐️だから[クラス継承機能]を使う!!

1.app/controllersの配下にusersフォルダを作成しsessions_controller.rbを作成

sessions_controller.rbを作成

app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
  def guest_sign_in
    user = User.guest  #guestは元々あるメソッドではなく下で定義
    sign_in user
    redirect_to user_path(user), notice: "guestuserでログインしました。"
  end
end

2.guestをmodelにて定義する

app/models/user.rb
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 = "guestuser"
    end
  end

◆find_or_create_by!とは

データの検索と作成を自動的に判断して処理を行う、Railsのメソッド
find_or_create_by(条件)←条件としたデータが存在するかどうかを判断した上で
・存在する場合には、そのデータを返す
・存在しない場合は、新規作成する  を判断して行ってくれる
⭐️「!」を付与することで、処理がうまくいかなかった場合にエラーが発生するようになり、結果不具合を検知しやすくなります。

◆SecureRandom.urlsafe_base64とは?

ランダムな文字列を生成するRubyのメソッドの一種 😲 {ランダムでパスワード作ってくれるんすげ〜!

3.ゲストユーザーでログイン後どこに飛ぶかをルーティング設定

config/routes.rb
devise_scope :user do
 post "users/guest_sign_in", to: "users/sessions#guest_sign_in"
end         #URL                     # コントローラー#アクション

devise_scope??

deviseに新しくルーティングを追加したいときに使用するもの

4.viewにボタンを追加

対応view
 <%= link_to "ゲストログイン(閲覧用)", users_guest_sign_in_path, class: "btn btn-secondary btn-sm btn-block mb-3 sign_in", method: :post %>

5.プロフィール編集を行えないようにする

対応するview
<% if user.email != "guest@example.com" %>
#!=は否定だから emailがguest用じゃなかったら編集ボタン表示って意味
<div class="row">
  <%= link_to "",edit_user_path(user),class: "btn btn-outline-secondary btn-block fas fa-user-cog edit_user_#{user.id}" %>
</div>
<% end %>

🥰 {完成〜!
😒 {まだだよ!URL打たれたらページ飛べちゃうよ!!!

6.URLを打っても打ったらユーザー詳細画面へリダイレクトする仕様にする

app/controllers/users_controller.rb
class UsersController < ApplicationController
before_action :ensure_guest_user, only: [:edit]
: 
  private
:
def ensure_guest_user
 @user = User.find(params[:id])
 if @user.email == "guest@example.com"
  redirect_to user_path(current_user) , notice: "ゲストユーザーはプロフィール編集画面へ遷移できません。"
 end
end

補足
被っているコードをまとめて汎用性を高く保つようにする。
今回は@user.email == "guest@example.com"を一緒にする
「?」をつけることで真か偽を出してくれる

app/models/user.rb
def guest_user?
 email == GUEST_USER_EMAIL
end

↓定義したので書き換えていく

app/controllers/users_controller.rb
def ensure_guest_user
 @user = User.find(params[:id])
 if @user.guest_user?
  redirect_to user_path(current_user) , notice: 'ゲストユーザーはプロフィール編集画面へ遷移できません。'
 end
end 

もしゲストユーザーだった場合はredirectに飛ぶよう〜👻

app/views/users/_info.html.erb
<% unless user.guest_user? %>
  <%= link_to '',edit_user_path(user),class: "btn btn-outline-secondary btn-block fas fa-user-cog edit_user_#{user.id}" %>
</div>
<% end %>

ゲストユーザーでないのであれば編集ボタン出すよ!ってことだから『unless』を使う👍🏻


以上!絶対必要なところなのでわかりやすくて良かった🤝

Discussion