rails 管理者が全Userの投稿削除をする(備忘録)


はじめに

備忘録的に書いておくので、少しちがっているところもあるかもしれません😭
説明も薄めです、ご了承ください。

Ruby on rails をつかって、Twitterアプリをつくっています。管理者が自分の投稿以外の、あらゆるユーザーの投稿を消せるようにしたいと思います。

ユーザー登録はGemのdeviseで実装しています。

Userに管理者を追加する

ターミナル
 rails g migration AddAdminToUsers
xxxxxxxxx_add_admin_to_users
 class AddAdminToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :admin, :boolean, default: false #ここを追加
  end
end
ターミナル
 rails db:migrate

次にseedファイルに管理者権限を持つユーザーを追加します。

db/seeds.rb
 User.create!(username:  "管理者",
             email: "[email protected]",
             password:  "11111111",
             password_confirmation: "11111111",
             admin: true)
ターミナル
 rails db:seed

管理者用のコントローラーをつくる

ターミナル
 rails g controller admin::tweets
controller/admin/tweets_controller
 class Admin::TweetsController < ApplicationController
   #  before_action :authenticate_user!も必要なら書いてください
  before_action :if_not_admin
   before_action :set_tweet, only: [:index, :new, :create, :show, :edit, :destroy] #onlyのアクションは必要なものだけ書いてください

 #中略 def indexとか必要なものを書いてください

  private
    def if_not_admin
      redirect_to root_path unless current_user.admin?
    end

    def set_tweet
      @tweet = Tweet.find(params[:id])
    end
  end

Routing設定

以下のコードを追加してください

config/routes
resources :tweets 
  namespace :admin do
    resources :tweets, only: [:index, :new, :create, :show,  :edit, :destroy]
  end

viewの設定

好きなところにコードを追加してください

app/views/tweets/index.html.erb

<div class="tweets-container">
  <% @tweets.each do |t| %>
    <div class="tweet">
        <%= t.user.email %>
        <%= t.body %>
        <%= t.created_at %>
        <%= link_to "詳細へ", tweet_path(t.id) %>
       <% if user_signed_in? && current_user.id == t.user_id %>  
         <%= link_to "編集する", edit_tweet_path(t.id) %>
         <%= button_to "削除する", tweet_path(t.id), method: :delete %>
       <% elsif user_signed_in? && current_user.admin? && current_user.id == t.user_id  %>  
         <%= link_to "編集する", edit_tweet_path(t.id) %>
         <%= button_to "削除する", tweet_path(t.id), method: :delete %>
      <% end %>  
        <% if current_user.admin? %>
         <%= link_to "管理者が削除するよ", tweet_path(t.id), method: :delete %>
        <% end %>
    </div>
  <% end %>
</div>

おわりに

わたしは以上のコードで実装しましたが、ところどころ書かなくてもいい場所もあるかもしれません😭
あくまでも参考例ですので、ご自身で足りないところ足りてるところを試行錯誤していただけると助かります。
間違い等もございましたらコメントで教えていただけるとうれしいです!
よろしくお願いいたします

参考サイト

【初心者向け】管理者ユーザーと管理者用controllerの追加方法[Ruby, Rails]
投稿の削除を投稿者と管理者どちらからもできるようにしたいです。