作って学ぶRuby on Rails Vol.29ログアウト機能を実装しよう!


作って学ぶRuby on Rails Vol.29ログアウト機能を実装しよう!
目次
  1. ログアウト機能

ログアウト機能

本項ではログアウト機能の実装を行います。ログアウト機能は、ログイン状態を解除し、前項で行った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は各環境により異なります。

Ruby_on_Rails_ログアウト1

また、前項でも少し触れましたが、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内で利用し、ログイン状態に応じて処理を分けてみましょう。

NEXT LESSON ☛ Modelのリレーションを設定しよう!

PREV LESSON ☛ ログイン機能を実装しよう!その3

目次 - Ruby & Ruby on Rails テキスト目次 -


関連記事

CodeCampus編集部
この記事を書いた人
CodeCampus編集部
まずは7日間お試し!人気プログラミング講座を無料公開中
オンライン・プログラミングレッスンNo.1のCodeCamp