※2022年から技術系の記事は個人ブログに投稿しております。ぜひこちらもご覧ください→yamaday0u Blog
エンジニア転職でポートフォリオとなるアプリを開発する際、企業の方がアプリを確認しやすいようにユーザー登録しなくてもよいゲストユーザー機能の実装が望ましいという話をよく聞きます。
そこで今回は、ぼくが自分のポートフォリオで実装したゲストユーザー機能の例を紹介します。
前提
- deviseを使ってユーザー登録機能が実装されている
- Rails 6.0.3.5
動作確認
「ゲストユーザーとしてログインする」ボタンをクリックすると、ゲストユーザーでアプリにログインできます。
ルーティングの設定
以下のようにパスとアクションを組み合わせを定義します
guest_log_in
アクションはこのあとコントローラーで自作で定義するアクションです。
devise_scope :user do
post 'users/guest_log_in', to: 'users/sessions#guest_log_in'
end
アクションの定義
以下のようにguest_log_in
アクションを定義します。
class Users::SessionsController < Devise::SessionsController
def guest_log_in
user = User.guest
sign_in user
redirect_to calendars_path, notice: 'Logged in as a guest'
end
end
アクションの中で使用しているsign_in
メソッドは、deviseが提供する機能で、サインイン状態にします。
ちなみにdeviseの公式GitHubのdevise/app/controllers/devise/sessions_controller.rb
内のDevise::SessionsController#create
がsign_in
メソッドです。※調べたことを書いているのですが、もし間違っていたらご指摘ください。ソースコードはこちら。
またguest
メソッドはこのあとモデルで定義します。
モデルの定義
モデルにはクラスメソッドであるguest
メソッドを定義します。
class User < ApplicationRecord
def self.guest
find_or_create_by!(email: 'guest@guest.mail') do |user|
user.name = 'ゲストユーザー'
user.password = SecureRandom.urlsafe_base64
end
end
end
find_or_create_by!
メソッドはRailsに用意されているメソッドで、「条件を指定して初めの1件を取得し、1件もなければ作成」します。
この場合、emailカラムがguest@guest.mail
である初めのレコードを取得し、なければnameカラムが「ゲストユーザー」、passwordはランダムな値を生成してくれるRubyモジュールであるSecureRandom
を使って生成し、新しいレコードを作成します。
ぼくのアプリではusersテーブルにnameカラムがあるため、nameの値を指定しています。
SecureRandom
については以下を参考にしてください。
Ruby 3.0.0 リファレンスマニュアル SecureRandomモジュール
リンクボタンの作成
リンクボタンは任意の場所に以下のように記述します。
<%= link_to "Log in as a guest", users_guest_log_in_path, method: :post %>
ゲストユーザーの編集ができないようにするアクション
ポートフォリオを公開した時にゲストユーザーを編集可能な状態していると、イタズラを受けてしまう危険性もあるので、編集できないようにするアクションを定義します。
before_action :ensure_normal_user, only: :edit
def ensure_normal_user
if resource.email == 'guest@guest.mail'
redirect_to user_path(@user.id), notice: 'You can not edit guest user'
end
end