[Ruby on rails]ゲストログイン機能 ゲストログインは削除、編集されないようにする


ゲストログインは作っておいた方が良い!

ゲストログイン押したら、ログインできちゃう便利機能です。
就職、転職活動でポートフォリオを外部の方に見せる場合には、作っておいた方が良いらしいです。
ゲストユーザーを作成せず、これでログインしてくださいとemail,passwordを提示したところで、
少し面倒なので見てもらえない可能性があります。
すぐ実装できるので、ゲストログインは作っておくべきだと思います!!!!
(他の人のポートフォリオ触ってみてもそうですが、
ゲストログインがないと、やっぱりすごく面倒に感じます。)

とても参考にした記事

気をつけないと、すぐ壊れる!!

今回ゲストログイン機能を実装しました。実装自体はうまくいったのですが、、
気をつけないとゲストログイン機能は簡単に壊れていきます。

落とし穴としては今のところ以下2点だと認識しています。
①ゲストログインは、退会(削除)ができないようにする!
②ユーザー情報の編集もできないようにする!

私の場合、新規登録時に入力させる情報は以下の通りになっています。

ルーティングをかく

Rails.application.routes.draw do
  mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
  devise_for :users, controllers: {
    registrations: 'users/registrations',
    sessions: 'users/sessions',
  }
#ここ追記しています!!!!!
  devise_scope :user do
    post 'users/guest_sign_in', to: 'users/sessions#guest_sign_in'
  end
  namespace :departments do
    resources :searches, only: :index
  end
省略

[devise_scope]は、deviseに新しくルーティングを追加したい場合に使います。(これを使わないとエラーが発生します。)
rb
devise_scope :users do
get 'ルーティング情報', to: 'users/registrations#アクション'
end

コントローラー記述

def guest_sign_in
    user = User.guest
    sign_in user
    redirect_to posts_path, notice: 'ゲストユーザーとしてログインしました。'
  end

モデルファイル記述

user.rb
def self.guest
    find_or_create_by!(name: 'ゲストユーザー',
                       email: '[email protected]',
                       join_year: '新入社員',
                       department_id: 1,
                       is_valid: true) do |user|
      user.password = SecureRandom.urlsafe_base64
    end
  end

ゲストログインボタン

<li class="nav-item">
        <%= link_to "ゲストログイン", users_guest_sign_in_path,class:"btn btn-light fas fa-seedling",method: :post %>
    </li>
ひとまず終わり!

ここまででゲストログインはできなくなったかと思います。

あとは、ゲストログインを削除、編集できないようにします。

退会させないようにする

ルーティング

devise_for :usersになってる場合は、書き換えてください。

  devise_for :users, controllers: {
    registrations: 'users/registrations'
  }

削除しようとしたら、トップ画面へリダイレクト

私は論理削除にしています。

app/controllers/users_controller.rb
 def destroy_confirm
    @user = current_user
  end

  def destroy_user
    @user = current_user
    if @user.email == '[email protected]'
      reset_session
      redirect_to :root
    else
      @user.update(is_valid: false)
      reset_session
      redirect_to :root
    end
  end

もしゲストユーザーが退会処理をしようとしたら、
ログアウトさせトップページにレダイレクトさせます。

編集させないようにする

ユーザー情報編集されると、
私の場合、「部署」「クラス(新入社員)」とか変更されると、
ゲストログインが壊れました。
なので、ゲストユーザーの場合には、
編集ページが表示されないようにしました。

edit.html.erb
<% if @user.email == '[email protected]'%>
       <p>ゲストユーザーはユーザー情報の編集ができません。</p>
      <% else %>