1
1

More than 1 year has passed since last update.

【超簡単】rails投稿機能で削除しても履歴残す!!(論理削除)

Last updated at Posted at 2022-08-27

やること

rails の投稿機能で削除してもレコードを完全に削除するのではなく、ユーザーから非表示になるのみで投稿者や管理者から復元できるようにする!
画面収録-2022-08-25-18.19.24.gif

手順

  1. gemのインストール
  2. カラムの追加
  3. 一覧ページの表示
  4. 削除、復元
    こんな感じでやっていきます!今回はgemの機能が強すぎるので gemの使い方がメインになります:massage:
    早速やっていきましょー!!

1.Gemのインストール

Gemfile
gem 'discard', '~> 1.2'
terminal
bundle install

2.カラムの追加

論理削除をしたいテーブルにdiscarded_atカラムを追加します!

terminal
rails db:rollback

対象のテーブルを作っているmigrationファイルをdownにしましょう
今回はtweetsテーブルでやります

db/migrate/20220116200153_create_tweets.rb
class CreateTweets < ActiveRecord::Migration[6.1]
  def change
    create_table :tweets do |t|

      #略

      t.datetime "discarded_at", precision: 6 #追加
      t.index ["discarded_at"], name: "index_posts_on_discarded_at" #追加

      #略

    end
  end
end
terminal
rails db:migrate

一覧ページの表示

モデルに追記

models/tweet.rb
include Discard::Model
tweets_controller
def index
    @tweets = Tweet.all #変更前

    @tweets = Tweet.undiscarded #変更後
end

削除、復元

今回はわかりやすいようにindexページ内で削除済みのものと削除されてないもの両方表示するように書きます

tweets_controller
#略
def index
    @tweets = Tweet.undiscarded #削除されてないやつ
    @del = Tweet.discarded #削除されたやつ
end
#略
tweets/index.html.erb
<h1>投稿一覧</h1>
<% @tweets.each do |t| %>
    <p>
        <%= t.title %> <!-- テキトー -->
        <%= t.body %> <!-- テキトー -->
        <%= t.discarded? %> <!-- trueなら論理削除済み、falseなら論理削除前 -->
    </p>
<% end %>

<h1>削除済み一覧</h1>
<% @del.each do |t| %>
    <p>
        <%= t.title %>
        <%= t.body %>
        <%= t.discarded? %>
    </p>
<% end %>

削除ボタン、復元ボタンの追加

config/routes.rb
#略
post 'restoration/:id' => 'tweets#restoration'
resources :tweets
tweets_controller
#略
def destroy
    tweet = Tweet.find(params[:id])
    tweet.discard
    redirect_to action: :index
end
def restoration
    tweet = Tweet.find(params[:id])
    tweet.undiscard
    redirect_to tweets_path
end
#略
tweets/index.html.erb
<h1>投稿一覧</h1>
<% @tweets.each do |t| %>
    <p>
        <%= t.title %>
        <%= t.body %>
        <%= t.discarded? %>
        <%= link_to "削除", tweet_path(t.id), method: :delete %>
    </p>
<% end %>

<h1>削除済み一覧</h1>
<% @del.each do |t| %>
    <p>
        <%= t.title %>
        <%= t.body %>
        <%= t.discarded? %>
        <%= button_to "復元", controller:"tweets", action:"restoration", id:t.id, method: :post %>
    </p>
<% end %>

補足

削除済みの表示を別のページに移したくなったら

@del = Tweet.discarded
<h1>削除済み一覧</h1>
<% @del.each do |t| %>
    <p>
        <%= t.title %>
        <%= t.body %>
        <%= t.discarded? %>
        <%= button_to "復元", controller:"tweets", action:"restoration", id:t.id, method: :post %>
    </p>
<% end %>

これだけ移動すればおけです!

最後に

ここまで読んでいただきありがとうございます!!
それじゃまた〜〜〜ばいばいちゃ〜〜ん

参考:https://techtechmedia.com/logiacal-deletion-discard/

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1