Deviseのメソッド

Deviseで認証をかける事が出来ましたが、いくつか問題があります。それらの問題を、Deviseのメソッドなどを使って解決していきます。

吉田先生

ユーザーのログイン機能を実装するのは大変なのでDeviseというGemを使用します。


 

 

問題1

まず、ログインしていない一般ユーザーはブログを見れないという問題です。認証をかけているためすべてのページが閲覧不可能であり、以下にアクセスしてもログインページに遷移してしまいます。

https://domain/articles

これを、解決するにはexceptというものを使用します。exceptを使用すると〜以外のアクションという指定が可能になります。

# articles_controller.rb

class ArticlesController < ApplicationController
  before_action :set_article, only: ...
  before_action :authenticate_user!,
                       <span style="color:#e67e22;">except: [:index, :show] </span>

 

問題2

次に、ログインしているにもかかわらず「ログイン」が、ログアウトしているにもかかわらず「ログアウト」が表示されてしまうという問題です。

これは、user_signed_in?メソッドとifを使う事で解決できます。user_signed_in?メソッドは、ユーザーがログイン中かどうか判断出来るメソッドです。

 

# index.html.erb

&lt;% if user_signed_in? %>
    &lt;%= link_to "編集",  edit_user_password_path %>
    &lt;%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
&lt;% else %>
    &lt;%= link_to "ログイン", new_user_session_path %>
&lt;% end %>

 

current_user

また、ログインしている時はemailアドレスを表示出来るようにしましょう。このような時は、current_userを使います。current_userというのは、ログイン中ユーザーの事です。

# index.html.erb

&lt;% if user_signed_in? %>
    &lt;%= current_user.email %>としてログイン中
    &lt;%= link_to "編集", edit_user_password_path %>
    &lt;%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
&lt;% else %>
    &lt;%= link_to "ログイン", new_user_session_path %>
&lt;% end %>

 

問題3

次に、ログインユーザーではないのにEdit, Destroyが見えてしまうという問題があります。これも先ほど追加したuser_signed_in?メソッドとifを使う事で解決できます。

# index.html.erb

&lt;% if user_signed_in? %>
    &lt;td>&lt;%= link_to 'Edit', edit_... %>&lt;/td>
    &lt;td>&lt;%= link_to 'Destroy', article, ... %>&lt;/td>
&lt;% end %>

では、これらの動作を以下にアクセスして試してみましょう。以下のように、問題が解決できていればOKです。

https://newsable-user.c9users.io

 

 

課題

Animalも同様に変更してみましょう。

 

次のレッスンでは、ビューを整えていきます。では、次のレッスンに進みましょう!

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×