🦙
ゲストログイン機能とゲストにプロフィール編集、退会させない
参考にさせていただきました
- ゲストログインをクリックすれば、ログインできる
- ゲストログインしたユーザーが、プロフィールを編集、退会できたら困るので
制限したい(ボタン表示させない)
ルーティング
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.guest
はUser
クラスのクラスメソッドとして、定義されている。
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