ログインチェック

各ページでログインのチェックを行い、ログインしている場合のみ画像のアップロードをできるようにします。 また他人のアップロードした画像の編集、削除をできないようにします。

ログインのチェックは、ViewとControllerの両方で行います。

Controllerのログインチェック

app/controllers/photos_controller.rb をエディタで開きます。

ログインチェックを行うメソッドを実装します。ログイン指定なかった場合は、メッセージを表示しindexにリダイレクトするようにします。この行のあとに

private

これらのコードを追加します。

def login_check
  unless user_signed_in?
    flash[:alert] = "ログインしてください"
    redirect_to root_path
  end
end

この行のあとに

class PhotosController < ApplicationController

この行を追加します。login_checkメソッドを :new, :edit, :update, :destroy のアクションの前に実行し、ログインチェックを行います。

before_action :login_check, only: [:new, :edit, :update, :destroy]

サーバーを起動します。すでにサーバーが起動している場合は、再起動してください。

rails s

ログインしていない状態で画像の編集や追加をしようとすると、メッセージが表示されindexにリダイレクトされることを確認してください。

Viewのログインチェック

Viewを修正します。

app/views/photos/index.html.erb をエディタで開きます。この行の前後を変更します。

<p><%= link_to 'New Photo', new_photo_path %></p>

このように変更します。

<% if user_signed_in? %>
  <p><%= link_to 'New Photo', new_photo_path %></p>
<% end %>

app/views/photos/show.html.erb をエディタで開きます。この行の前後を変更します。

<%= link_to 'Edit', edit_photo_path(@photo) %>
<%= link_to 'Destroy', @photo, method: :delete, data: { confirm: 'Are you sure?' } %>

このように変更します。ログイン済みで、写真のユーザーとログインユーザーが一致している場合は、リンクを表示します。

<% if user_signed_in? && @photo.user == current_user %>
  <%= link_to 'Edit', edit_photo_path(@photo) %>
  <%= link_to 'Destroy', @photo, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

@photo.user で、PhotoからUserを取得しています。このままだとViewからDBに対するクエリーが発行されてしまうため、Controllerで合わせて取得するようにします。

app/controllers/photos_controller.rb をエディタで開きます。このコードを

def show
  @photo = Photo.find(params[:id])
end

このように変更します。

def show
  @photo = Photo.includes(:user).find(params[:id])
end