続・初見で難解だったdeviseを改めてまとめてみた


はじめに

 前回の「初見で難解だったdeviseを改めてまとめてみた」の続き。今回はログアウト機能について。
deviseの導入について説明している、前回の投稿はこちら↓
https://qiita.com/TerToEer_sho/items/b5523ad100d08126a547

ログアウト機能の実装

 
 そもそも、ログアウトのボタンは、ログインしているユーザーにしか必要がない。
 つまり、
ログイン状態であれば、ログアウトボタンを表示させる。
 また、ログインしている状態であれば、ログアウトボタンは必要ない。
 つまり、
ログインしていない状態であれば、ログインボタンを表示させる。

 では、どのようにして、ログインしているのかどうかを判断するのか。これもまた、deviseの優れたところで、deviseのGemをインストールすると使えるメソッドがある。

user_signed_in?メソッド

 日本語訳通り、サインインしているかどうかを真偽値(true/false)で返す。

 ログインしている→true
 ログインしていない→false

 なぜ、ログインしているか判断できるのか、詳しいことはわからない。

user_signed_in?メソッドで真偽値が返ってくることを利用して、if文を用いて条件分岐させる。

つまり、

index.html.erb
<% if user_signed_in? %>
 <%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
<% else %>
 <%= link_to 'ログイン', new_user_session_path %>
 <%= link_to '新規登録', new_user_registration_path %>
<% end %>

Railsのビューファイルを例にコードを書くとこんな感じになる。

気を付けるべき点は、

ログアウトではlink_toメソッドの第三引数でHTTPメソッドを「delete」にすること。
 イメージとしては、ログインしている状態を削除するといった感じ。ちなみに、「delete」にしないと、エラーが出る。理由は、link_toメソッドは、デフォルトでのHPPTメソッドが、「get」だから。link_toって読んでの通り、「リンク先に飛ばしますよ〜」という、メソッドだから。

②第二引数のパスについては、
ターミナルで、

rails routes

とコマンドを打ち、確かめる。特別な指定をしていない限りは、上記と同じで大丈夫。

ポイント

  •  ログイン状態を判断するuser_signed_in?メソッドを使う。
  •  if文を用いて、表示を分岐させることが可能。
  •  ログアウトをlink_toメソッドで記述する場合、「method: :delete」が第三引数に必要。

最後に

便利なuser_signed_inメソッドが使えるからこそ、少ない作業で実装できる。