🐕

ゲストログイン機能

に公開

ゲストログイン機能の作成

Deviseではsign_inというメソッドが存在しており、これはユーザーをログイン状態にするものです。
あとは、どのユーザーをログイン状態にするべきか、というところで、ゲスト用のユーザーを作成した上でログインさせます。

通常のログイン機能はsessions_controller.rbに記述されています。※これはGemでインストールされているため、アプリケーションのディレクトリツリーからは確認できません。
今回はゲストログイン用に独自のメソッドを作成したいためDeviseのsessions_controller.rbの機能を継承して実装します。

sessions_controller.rbには次のように記述します。

app/controllers/public/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へ処理を行うためのルーティングを設定します。

config/routes.rb
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メソッドを定義します。

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 = "ゲストユーザー"
    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の記述が可能になります。

機能部分の作成は完了しました。
次はトップページにゲストログインボタンを配置します。

ゲストログインボタンを配置する

配置したいところに配置
今回はログイン画面に追加

app/views/public/sessions/new.html.erb
<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