Rails|ゲストユーザーのログイン機能
はじめに
ポートフォリオ制作にあたり、ゲストログイン機能を実装しました。
前提
deviseを導入済み
user と admin の2つの権限を作成済み
ゲストユーザーのログイン機能
ルーティング
ゲストユーザーログイン用のルーティングを設定する。
# ゲストユーザーログイン
devise_scope :user do
post 'users/guest_sign_in', to: 'public/sessions#guest_sign_in'
end
devise_scope do .... end
これは deviseモデルである user
のルーティングをカスタマイズするための記述。
routeingにおける scopeについては以下の記事参照
post 'users/guest_sign_in', to: 'public/sessions#guest_sign_in'
この部分では
postメソッド
で、
users/guest_sign_in
というURLの時
public/sessions
コントローラの guest_sign_in
アクション
を使う、という意味を表す。
クラスメソッド
ゲストログイン用の guestメソッドを作成する。
# ゲストログイン用メソッド
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!
メソッドで、新しいデータを作成する場合にのみ実行される。
コントローラ
コントローラを作成する。
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
をログインさせている。
ビュー
ビュー部分に以下のようなリンクを設定する。
<%= link_to "ゲストログイン", users_guest_sign_in_path, method: :post, class: "btn btn-outline-secondary mr-3" %>
ゲストユーザーの機能制限
ゲストユーザーの行動に制限をかけたいときは、以下のように設定する。
今回は、ゲストユーザーのデータを削除できないようにする。
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
参考にさせていただいた記事
開発環境
ruby 3.1.2p20
Rails 6.1.7.4
Cloud9
Discussion