Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

railsで簡単ログイン(ゲストユーザーログイン機能)を実装する方法

今回はポートフォリオを見てもらう確率を上げるために必須な、簡単ログインの実装方法を書いていきます。

開発環境

Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系

前提

devise導入済み
通常の新規登録、ログイン、ログアウト機能に関しては実装済み
投稿機能ができるアプリを作っており、postsモデルとpostsコントローラーが登場しますが、ご自身の例に置き換えてご理解ください。

ルーティング設定

まずはルーティングを設定します。

# HTTPメソッドはpostで、'/posts/guest_sign_in'というURLでpostsコントローラーのnew_guestアクションを参照する
post '/posts/guest_sign_in', to: 'posts#new_guest'
routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: "posts#index"
  # 次の1行を追加
  post '/posts/guest_sign_in', to: 'posts#new_guest'
  resources :posts do
    resources :comments, only: [:create, :destroy]
    collection do
      get 'search'
    end
  end
  resources :users, only: :show
  post 'like/:id' => 'likes#create', as: 'create_like'
  delete 'like/:id' => 'likes#destroy', as: 'destroy_like'
end

コントローラーにnew_guestアクションを記述

それでは次にpostsコントローラーにアクションを定義していきます。
deviseのメソッド find_or_create_by や sign_in を使っていますので、気になる方は調べてみてください。
また、パスワードは SecureRandom.alphanumeric を用いてランダム生成しつつも、全て英字、全て数字のパスワードが生成されないように工夫しています。

参考:https://qiita.com/take95/items/61b181449b38d4415fc3

posts_controller.rb
def new_guest
  # emailでユーザーが見つからなければ作ってくれるという便利なメソッド
  user = User.find_or_create_by(email: 'guest@example.com') do |user|
  # 自分はユーザー登録時にニックネームを必須にしているのでこの記述が必要
  user.nickname = "ゲスト"
  # 英数字混合を必須にしているので、ランダムパスワードに、英字と数字を追加してバリデーションに引っかからないようにしています。
  user.password = SecureRandom.alphanumeric(10) + [*'a'..'z'].sample(1).join + [*'0'..'9'].sample(1).join
  end
  # sign_inはログイン状態にするデバイスのメソッド、userは3行目の変数userです。
  sign_in user
  # ログイン後root_pathに飛ぶようにしました。
  redirect_to root_path
end

また、deviseでメール確認機能を実装済みの場合、user.confirmed_at = Time.nowを追加する必要があります。

posts.controller.rb
def new_guest
  user = User.find_or_create_by(email: 'guest@example.com') do |user|
  user.nickname = "ゲスト"
  user.password = SecureRandom.alphanumeric(10) + [*'a'..'z'].sample(1).join + [*'0'..'9'].sample(1).join
  # 以下一文を追加
  user.confirmed_at = Time.now
  end
  sign_in user
  redirect_to root_path
end

ビューを追加

簡単ログインのリンクをヘッダーに追加します。
自分の場合は部分テンプレートに切り出しているので、その部分テンプレート内の記述を編集します。

コンソールでrails routesを打ってパスを確認しましょう。その後ヘッダーに次の1文を追加します。

<li><%= link_to 'ゲストログイン(閲覧用)',posts_guest_sign_in_path, class: "guest-login", method: :post %></li>

この時、HTTPメソッドをつけ忘れないように注意してください

_header.html.erb
<nav>
  <ul class='lists-right'>
    <% if user_signed_in? %>
    <li><%= link_to current_user.nickname, user_path(current_user.id), class: "user-nickname" %></li>
    <li><%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %></li>
    <% else %>
  # 以下1文を追加
    <li><%= link_to 'ゲストログイン(閲覧用)',posts_guest_sign_in_path, class: "guest-login", method: :post %></li>
    <li><%= link_to 'ログイン',new_user_session_path, class: "header-login" %></li>
    <li><%= link_to '新規登録',new_user_registration_path, class: "sign-up" %></li>
    <% end %>
  </ul>
</nav>

以上で簡単ログイン(ゲストユーザーログイン機能)を実装できました。
参考になれば幸いです。

toto_public
早稲田中退 → プログラミング勉強中(Ruby、Ruby on Rails、 HTML、 CSS、 JavaScript)の22歳です。 エンジニア転職を目指しています。 日々の学習をアウトプットしていくために、アカウントを作りました。よろしくお願い致します。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away