🐕

Rails|ゲストユーザーのログイン機能

2023/09/09に公開

はじめに

ポートフォリオ制作にあたり、ゲストログイン機能を実装しました。

前提

deviseを導入済み
user と admin の2つの権限を作成済み
https://zenn.dev/airiin/articles/4f108da2f28090

ゲストユーザーのログイン機能

ルーティング

ゲストユーザーログイン用のルーティングを設定する。

routes.rb
  # ゲストユーザーログイン
  devise_scope :user do
    post 'users/guest_sign_in', to: 'public/sessions#guest_sign_in'
  end

devise_scope do .... end
これは deviseモデルである userのルーティングをカスタマイズするための記述。
routeingにおける scopeについては以下の記事参照
https://qiita.com/ryosuketter/items/9240d8c2561b5989f049

post 'users/guest_sign_in', to: 'public/sessions#guest_sign_in'
この部分では
postメソッドで、
users/guest_sign_inというURLの時
public/sessionsコントローラの guest_sign_inアクション
を使う、という意味を表す。

クラスメソッド

ゲストログイン用の guestメソッドを作成する。

models/user.rb
# ゲストログイン用メソッド
  def self.guest
    find_or_create_by!(email: 'guest@example.com') do |user|
      user.password = SecureRandom.urlsafe_base64
      user.name = "ゲスト"
      user.name_kana = "げすと"
      user.country_code = "JP"
      user.job = "大学生"
      user.is_deleted = false
      #*上記は一例です。他に必要なカラムがあれば追記してください*
    end
  end

find_or_create_by!
指定した条件でデータを検索し、存在すればそのデータを返し、存在しなければ新しいデータを作成するメソッド。

do |user| ... end
これは、find_or_create_by!メソッドで、新しいデータを作成する場合にのみ実行される。

コントローラ

コントローラを作成する。

controllers/public/sessions_controller.rb
 def guest_sign_in
    user = User.guest
    sign_in user
    flash[:notice] = "ゲストユーザーとしてログインしました。"
    redirect_to root_path
  end

user = User.guest
ここで、先ほどモデル部分で作成した guestメソッドを利用している。

sign_in user
これは deviseのsign_inメソッドを利用して、指定のuserをログインさせている。

ビュー

ビュー部分に以下のようなリンクを設定する。

example.html.erb
<%= link_to "ゲストログイン", users_guest_sign_in_path, method: :post, class: "btn btn-outline-secondary mr-3" %>

ゲストユーザーの機能制限

ゲストユーザーの行動に制限をかけたいときは、以下のように設定する。
今回は、ゲストユーザーのデータを削除できないようにする。

registrations_controllers.rb
class Public::RegistrationsController < Devise::RegistrationsController
  before_action :ensure_normal_user, only: [:destroy]
  
  protected
  
    def ensure_normal_user
      if resource.email == 'guest@example.com'
        flash.now[:notice] = "ゲストユーザーの削除はできません。"
        redirect_to root_path
      end
    end
    
end

参考にさせていただいた記事

https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104
https://zenn.dev/goldsaya/articles/9ae54ab4daef83

開発環境

ruby 3.1.2p20
Rails 6.1.7.4
Cloud9

Discussion