2

我想通过administrate在管理面板上通过偏执狂更改所有已删除的记录。我的问题是我正在寻找一种方法来做这些事情,但直到现在还没有成功

实际上我想要做的是覆盖特定控制器上的 index 方法生成 with Administrate,以便将所有元素(是否删除)作为当前控制器的资源。像这样:

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

但是当我从管理面板创建一个 foo 对象并删除它之后。该记录不再显示,我想让它仍然可见,以便管理员可以更改它。

如果有人有意见使这成为可能,那就太好了。

预先感谢您的帮助。

4

1 回答 1

2

首先非常感谢@Tom Lord,它帮助我解决了我的问题,这就是解决方案:

  1. 首先在您的app/controllers/admin/application_controller.rb生成中覆盖Administrate如下:
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. 在你的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

当然,更改deleted_at字段取决于您可能为添加偏执狂宝石所做的迁移。

于 2018-01-09T13:33:00.377 回答