ログアウト機能
本項ではログアウト機能の実装を行います。ログアウト機能は、ログイン状態を解除し、前項で行ったsocial_account_signed_in?メソッドでfalseが返るようにします。
それでは、ログアウト用のControllerを作成します。
下記のコマンドを実行して下さい。
$ rails generate controller sessions --skip-template-engine
上記コマンドは、sessionsというControllerを作成するのですが、 --skip-template-engineというオプションを付加しています。このオプションを付加することで、Viewを生成しません。
Viewを生成しない理由としては、ログアウトボタンを押下した後にroot_pathへリダイレクトするので今回は不要としています。
もし、ログアウト後に専用のページを表示したい場合は、Viewを生成しても問題はありません。
上記コマンドを実行すると、app/controllers/sessions_controller.rb というファイルが作成されます。
class SessionsController < ApplicationController
end
初期状態だと、SessionsController < ApplicationControllerとなっていますが、下記のように編集します。
class SessionsController < Devise::SessionsController
end
ApplicationController を Devise::SessionsController に書き換えました。この記述によりControllerに対して、devise ( gem ) の機能を利用できる状態にしています。
続いて、下記のようにActionを追加します。
class SessionsController < Devise::SessionsController
\# ログアウト
def destroy
super
session[:keep_signed_out] = true
end
end
destroyというActionを定義していますが、これがログアウトを行う処理になります。
superという記述がありますが、これはdevise( gem )の機能を利用する準備を整える記述になります。その次の行で、session[:keep_signed_out] = trueと記述していますが、この記述によりサーバー側で保持しているログイン情報をログアウト状態に切り替えます。
続いてルーティングの設定を行います。
Rails.application.routes.draw do
devise_for :social_accounts, controllers: {
omniauth_callbacks: "omniauth_callbacks"
}
\# ログアウト
devise_scope :social_account do
get 'sign_out', to: "sessions#destroy"
end
root "top#index"
get "top/profile"
resources :users
end
上記のハイライト部3行を追記して下さい。
この記述により、sign_out_path (ログアウトのURLを生成する) メソッドが使用できるようになります。devise_scopeという記述は、devise ( gem )が提供する記法なので、ここでは言及しません。
これで、ログアウトの機能部分の実装は完了です。
それでは、Viewにログアウトボタンを配置していきます。
本カリキュラムの最初に作成した、app/views/top/index.htmlを開いてください。
下記コードのハイライト部分を記述して下さい。
<h1>Top#index</h1>
<p>Find me in app/views/top/index.html.erb</p>
<div>
<%= link_to 'Google認証', social_account_omniauth_authorize_path(:google_oauth2) %>
</div>
<div>
<%= link_to 'ログアウト', sign_out_path %>
</div>
※確認しやすいようにdivタグも挿入しています。
画面で確認すると下の図のようになります。
http://xxxxx.c9users.io:8080
※ xxxxxは各環境により異なります。
また、前項でも少し触れましたが、social_account_signed_in? というメソッドでログイン状態を判定することができます。
例えば、Viewを下記のように編集して下さい。
<h1>Top#index</h1>
<p>Find me in app/views/top/index.html.erb</p>
<% if social_account_signed_in? %>
<div>
<%= link_to 'ログアウト', sign_out_path %>
</div>
<% else %>
<div>
<%= link_to 'Google認証', social_account_omniauth_authorize_path(:google_oauth2) %>
</div>
<% end %>
上記のように編集することで、ログインしている場合はログアウトボタンを、ログアウト状態の場合はログイン(認証)ボタンを表示するようになります。
http://xxxxx.c9users.io:8080
※ xxxxxは各環境により異なります。
Try ログイン状態を判定しよう social_account_signed_in?メソッドをController内で利用し、ログイン状態に応じて処理を分けてみましょう。
未経験でも、現役エンジニアの手厚い指導が受けられるCodeCampのレッスン【無料カウンセリング】とは? 【CodeCampの無料カウンセリング】で知ることができる内容 自分にあったプログラミング言語とは? 初心者のための挫折しない 学習の進め方
独学よりも速く、確実に プログラミングを習得する方法
満足度97.1%、現役エンジニアのマンツーマンレッスンとは?
CodeCampがプログラミング初心者から選ばれる理由
未経験からエンジニア転職・フリーランスとして活躍するステップ
開催時間:毎日9時〜21時迄(所要時間40分) PCとインターネットがあれば、日本全国どこからでも受講できます
CodeCampで学習できる言語・技術