🦙

ゲストログイン機能とゲストにプロフィール編集、退会させない

2024/07/21に公開

https://zenn.dev/goldsaya/articles/9ae54ab4daef83
参考にさせていただきました

  • ゲストログインをクリックすれば、ログインできる
  • ゲストログインしたユーザーが、プロフィールを編集、退会できたら困るので
    制限したい(ボタン表示させない)

ルーティング

config/routes.rb
 devise_scope :user do
    post 'users/guest_sign_in', to: 'public/sessions#guest_sign_in'
 end
  • to:オプションは、ルーティングで特定のアクションを指定するために使う。

コントローラー

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

モデル

app/models/user.rb
#クラスメソッドを定義
def self.guest
      find_or_create_by!(email: 'guest@example.com') do |user|
        user.password = SecureRandom.urlsafe_base64
        user.name = "Guest User"
    end
end
#インスタンスメソッドを定義(あとで使う)
def guest?
    email == 'guest@example.com'
end
  • email: 'guest@example.com'に一致するレコードをデータベースから探す。
  • SecureRandom.urlsafe_base64は、ランダムなURLで安全に使用できるパスワードを作ってくれる。
  • selfメソッドはクラスメソッドを定義するために使う。
    クラスメソッドは、そのクラス自体に対して、呼び出されるメソッドであるため、
    インスタンスメソッドとは違う。
    この場合、self.guestUserクラスのクラスメソッドとして、定義されている。

selfメソッドの役割

selfを使うことで、そのメソッドがクラスメソッドであることを示している。クラスメソッドは、インスタンスメソッドとは異なり、インスタンス化しなくてもクラスそのものに対して、直接呼び出せる。

ビュー

views/users/show.html.erb
<td>
    <% if @user.id == current_user.id && !current_user.guest? %>
        <%= link_to "編集", edit_user_path(current_user.id), class: 'btn btn-sm btn-success' %>
    <% end %>
</td>
  • current_user.guest?を使ってゲストユーザーかどうかを判定している。

ユーザーモデルにゲスト判定メソッドを追加する

models/user.rb
 def guest?
    self.email == 'guest@example.com'
 end
  • Userモデルにguest?メソッドを追加する。このメソッドはユーザーがゲストかどうかを判定する。
  • ユーザーのメールアドレスが[guest@example.com]であるかどうかチェックすることで、ゲストユーザーかどうかを判定する。

ゲストユーザーに定義(上記で実装済み)

models/user.rb
def guest?
      self.email == 'guest@example.com'
end

ユーザーコントローラーで制限する

class Public::UsersController < ApplicationController
before_action :authenticate_user!, only: [:show, :edit, :update]
before_action :set_user, only: [:likes]
before_action :ensure_guest_user, only: [:edit, :update, :destroy]
:
:
private
:
:
def ensure_guest_user
    if current_user.guest?
      flash[:guestout] = "ゲストユーザーはこの操作を行うことができません。"
      redirect_to root_path
    end 
  end
end
  • before_actionを使って、ゲストユーザーが特定の操作をできないように制限する。
  • もし、ゲストユーザーがurlで直接入ろうとした場合に、root_pathでトップ画面へ遷移して、メッセージを表示させる。

これで、直接入力されても阻止できる。

Discussion