Rails6で編集削除のボタンや権限を投稿者のみに表示する方法を実装していきます。
投稿機能はscaffoldではなく、独自に作りました。(ほぼ内容はscaffoldと同じですが、、、)
バージョンと仕様
- ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin19]
- Rails 6.1.0
- devise (4.7.3)
- gem 3.0.3
投稿者のみに編集削除ボタンを表示させる
<h1><%= @user.username %>のユーザーページ</h1>
<h2>メールアドレス</h2>
<%= @user.email %>
<ul>
<% @user.posts.each do |post| %>
<li>
<%= post.title %><br>
<%= link_to '詳細', post_path(post.public_uid) %> |
<% if user_signed_in? && current_user.id == post.user_id %>
<%= link_to '編集', edit_post_path(post.public_uid), data: {"turbolinks" => false} %> |
<%= link_to '削除', post_path(post.public_uid), method: :delete, data: { confirm: '本当にいいですか?' } %>
<% end %>
</li>
<% end %>
</ul>
投稿者のみに編集削除の権限を与える
posts_controller.rb
に下記を追加します。
before_action :baria_user, only: [:edit, :destroy]
private
def baria_user
unless Post.find_by(public_uid: params[:id]).user_id == current_user.id
flash[:notice] = "権限がありません"
redirect_to posts_path
end
end
僕の場合は、投稿記事のURLをidではなく、「ab3a635855051291cfe8」のような乱数にしているため、Post.find_by(public_uid: params[:id])
となっています。
これで、投稿者のみが編集や削除が可能になります。
以上です。