1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

開発環境

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>
  

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

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?