ruby-on-railsrubyruby-paranoiarails-administrate

Rails using Paranoia and Administrate, Is there a way to get deleted record with administrate for user?


I would like to get all deleted records change by paranoia on admin panel with administrate. My problem is that I'm finding a way to do this stuff but until now without success

Actually what I'm trying to do is to override index method on a specific controller generate with Administrate, in order to get all elements (deleted or not) as resources for the current controller. Like so:

controllers/admin/foo_controller.rb

module Admin
  class FooController < Admin::ApplicationController
    super
    resources = Foo.where("at_delete IS NOT NULL").page(params[:page])
  end
end

But when I create a foo object from the admin panel, and after removed it. The record isn't display anymore and I would like to get it still visible for giving the possibility to admin to change it.

If anyone has an opinion to make this possible, it would be nice.

Thank you in advance for your help.


Solution

  • First of all a big thanks to @Tom Lord, that help me to solved my problem, and that is the solution:

    1. First of all override in your app/controllers/admin/application_controller.rb generate by Administrate as below:
    module Admin
      class ApplicationController < Administrate::ApplicationController
    
        ...
    
        def index
          search_term = params[:search].to_s.strip
          resources = Administrate::Search.new(scoped_resource,
                                           dashboard_class,
                                           search_term).run
          resources = resources.includes(*resource_includes) if resource_includes.any?
          resources = order.apply(resources)
          resources = resources.page(params[:page]).per(records_per_page)
          resources = finder_chain_additions(resources)
          page = Administrate::Page::Collection.new(dashboard, order: order)
    
          render locals: {
            resources: resources,
            search_term: search_term,
            page: page,
            show_search_bar: show_search_bar?
          }
        end
    
      private
        def scoped_resource
          begin
            # Provide resource with deleted_at field generate with Paranoia
            resource_class.unscoped
          rescue
            # Used for models whose don't have Paranoia field
            resource_class
          end
        end
    
        def finder_chain_additions resources
          begin
            resources.with_deleted
          rescue
            resources
          end
        end
      end
    end
    
    1. In your app/dashboards/foo_dashboard.rb
    require "administrate/base_dashboard"
    
    class ArticleDashboard < Administrate::BaseDashboard
      # ATTRIBUTE_TYPES
      # a hash that describes the type of each of the model's fields.
      #
      # Each different type represents an Administrate::Field object,
      # which determines how the attribute is displayed
      # on pages throughout the dashboard.
      ATTRIBUTE_TYPES = {
        id: Field::Number,
        ...
        created_at: Field::DateTime,
        updated_at: Field::DateTime,
        deleted_at: Field::DateTime,
      }.freeze
    
      # COLLECTION_ATTRIBUTES
      # an array of attributes that will be displayed on the model's index page.
      #
      # By default, it's limited to four items to reduce clutter on index pages.
      # Feel free to add, remove, or rearrange items.
      COLLECTION_ATTRIBUTES = [
        :id,
        ...
        :deleted_at,
        :hide,
      ].freeze
    
      # SHOW_PAGE_ATTRIBUTES
      # an array of attributes that will be displayed on the model's show page.
      SHOW_PAGE_ATTRIBUTES = [
        :id,
        ...
        :deleted_at,    
        :created_at,
        :updated_at,
      ].freeze
    
      # FORM_ATTRIBUTES
      # an array of attributes that will be displayed
      # on the model's form (`new` and `edit`) pages.
      FORM_ATTRIBUTES = [
        ...
        :deleted_at,
      ].freeze
    
      # Overwrite this method to customize how articles are displayed
      # across all pages of the admin dashboard.
      #
      # def display_resource(article)
      #   "Article ##{article.id}"
      # end
    end
    

    Of course change deleted_at field depends on the migration you may have done in order to add paranoia gem.