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