【Rails応用講座 4】Deviseによるユーザーの作成 >
Deviseのメソッド

Deviseのメソッド

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

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

https://domain/articles

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

# articles_controller.rb

class ArticlesController < ApplicationController
  before_action :set_article, only: ...
  before_action :authenticate_user!,
                       except: [:index, :show] 

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

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

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

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

# index.html.erb

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

次に、ログインユーザーではないのにEdit, Destroyが見えてしまうという問題があります。

これも先ほど追加したuser_signed_in?メソッドとifを使う事で解決できます。

# index.html.erb

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

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

https://newsable-user.c9users.io

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

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

無料講座一覧を見る