やること
rails の投稿機能で削除してもレコードを完全に削除するのではなく、ユーザーから非表示になるのみで投稿者や管理者から復元できるようにする!
手順
- gemのインストール
- カラムの追加
- 一覧ページの表示
- 削除、復元
こんな感じでやっていきます!今回はgemの機能が強すぎるので gemの使い方がメインになります
早速やっていきましょー!!
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 %>
これだけ移動すればおけです!
最後に
ここまで読んでいただきありがとうございます!!
それじゃまた〜〜〜ばいばいちゃ〜〜ん