今回はポートフォリオを見てもらう確率を上げるために必須な、簡単ログインの実装方法を書いていきます。
開発環境
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'
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
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を追加する必要があります。
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メソッドをつけ忘れないように注意してください
<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>
以上で簡単ログイン(ゲストユーザーログイン機能)を実装できました。
参考になれば幸いです。