投稿の編集ボタンと削除ボタンの表示

編集ボタンと削除ボタンが投稿した人物にしか表示できないようにする方法を教えます。

<div class="btn_list">
  <% if current_user && current_user.id == @shop.user_id %> <!-- ログインユーザーが投稿者である場合に表示 -->
    <div class="edit_btn">
      <%= link_to '編集', edit_shop_path(@shop) %>
    </div>
    <div class="del_btn">
      <%= link_to '削除', shop_path(@shop), method: :delete, data: { confirm: '本当に削除しますか?' } %>
    </div>
  <% end %>
  
  <div class="bookmark_btn">
    <% if current_user && current_user.bookmarks.exists?(shop_id: @shop.id) %>
      <%= link_to delete_bookmark_shop_path(@shop), method: :delete, class: "bookmark-btn" do %>
        <i class="fas fa-star bookmarked"></i>
      <% end %>
    <% else %>
      <%= button_to bookmark_shop_path(@shop), method: :post, class: "bookmark-btn" do %>
        <i class="far fa-star"></i>
      <% end %>
    <% end %>
  </div>
</div>

上記のコードでは、current_user が @shop.user(投稿者)と一致する場合にのみ、edit_btn と del_btn の部分が表示されます。それ以外の場合は非表示になります。
また、この場合はshopモデルをuserモデルと関連づけるには以下のコードを書きます。

class Shop < ApplicationRecord
  belongs_to :user
  # ... 他のコード ...
end

また、shops_controllerのcreateアクションも以下の様にします。

def create
  @shop = Shop.new(shop_params)
  @shop.user = current_user # ユーザーオブジェクトを関連付ける
  @shop.image.attach(params[:shop][:image]) if params[:shop][:image]
  tag_names = params[:shop][:tag_names].split(",")

  if @shop.save
    redirect_to shops_path, notice: '店の情報が登録されました'
  else
    render :new
  end
end

これにより、投稿で編集ボタンと削除ボタンが表示・非表示が可能となります。

この記事が気に入ったらサポートをしてみませんか?