#19 Deleting and Undeleting with Paranoia
Summary
When your app is using Paranoia, calling destroy on an ActiveRecord object doesn't actually destroy the database record, but just hides it.rails view model 7:34
Summary
Gemfilegem "paranoia"
bashrails g migration add_deleted_at_to_comments deleted_at:datetime:index
comment.rb class Comment < ActiveRecord::Base
acts_as_paranoid
end
bash rails db
sqlite> .mode column
sqlite> .headers on
sqlite> select * from comments;
console Comment.last.destroy
Comment.with_deleted.last.restore
Comment.last.really_destroy!
show.html.erb <div class='col-xs-8'>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Comments</h3>
</div>
<ul class='list-group'>
<% @user.comments.each do |comment| %>
<li class='list-group-item'>
<%= comment.content %>
<span class='pull-right'>
<%= link_to 'delete', user_comment_path(@user, comment, type: :normal), method: :delete, class: 'badge' %>
<em><%= time_ago_in_words comment.created_at %></em>
</li>
<% end %>
</ul>
</div>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Deleted Comments</h3>
</div>
<ul class='list-group'>
<% @user.comments.only_deleted.each do |comment| %>
<li class='list-group-item'>
<%= comment.content %>
<span class='pull-right'>
<%= link_to 'undelete', user_comment_path(@user, comment, type: :undelete), method: :delete, class: 'badge' %>
<%= link_to 'really delete', user_comment_path(@user, comment, type: :forever), method: :delete, class: 'badge' %>
<em><%= time_ago_in_words comment.created_at %></em>
</li>
<% end %>
</ul>
</div>
</div>
users_controller.rb @user = User.find(params[:user_id])
@comment = @user.comments.with_deleted.find(params[:id])
if params[:type] == 'normal'
@comment.destroy
elsif params[:type] == 'forever'
@comment.really_destroy!
elsif params[:type] == 'undelete'
@comment.restore
end