編集ボタンと削除ボタンが投稿した人物にしか表示できないようにする方法を教えます。
<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
これにより、投稿で編集ボタンと削除ボタンが表示・非表示が可能となります。