before_actionを使って他人の投稿の編集/削除を制限する

前回でblogとuserの紐付けをしました。

maa0917.hatenablog.com

今回は他人の投稿を編集/削除を制限する実装をしていきます。

  • controllerでアクセス制限

  • viewで編集や削除ボタンを非表示にする

という実装をしていきます。

controllerでアクセス制限

まずはcontroller側で制限をかけます。
privateでensure_correct_userを定義して、before_actionでedit、update、destroyを指定します。

(app/controllers/blogs_controller.rb)

class BlogsController < ApplicationController
  before_action :ensure_correct_user, only: [:edit, :update, :destroy]
  private

def ensure_correct_user
  @blog = Blog.find(params[:id])
  if @blog.user_id != current_user.id
    flash[:notice] = "権限がありません"
    redirect_to blogs_path
  end
end

これで更新や削除をしようとすると、blog一覧画面にリダイレクトするようになります。

viewで権限のない編集・削除のリンクを非表示にする

次にviewで、権限のない編集・削除のリンクを非表示にさせます。

(app/views/blogs/index.html.erb)

<% if user_signed_in? %>
  <% if current_user.id == blog.user_id %>
    <td><%= link_to 'Edit', edit_blog_path(blog) %></td>
    <td><%= link_to 'Destroy', blog, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  <% end %>
<% end %>

同様にshowでも非表示にします。

(app/views/blogs/show.html.erb)

<% if user_signed_in? %>
  <%= link_to 'Edit', edit_blog_path(@blog)  if current_user.id == @blog.user_id %> |
<% end %>

これで、他人の投稿を編集/削除させないの実装が完成です。