Rails 5 偏执狂 - 如何 'show' 删除记录?

Rails 5 Paranoia - How can I 'show' a deleted record?

软删除记录后,我无法在控制器上的 show 操作上调用它,因为它会查找与记录的 ID WHERE deleted_at IS NULLL 匹配的记录,这是正确的gem 的目的,但我仍然希望能够在应用程序中以某种“只读”状态访问它,以便允许用户查看存档并可能恢复它。

如何绕过删除范围才能再次访问该对象?

更新 1

根据@slowjack2k 的建议,我可以通过以下查询访问软删除的记录:

 @area = Area.only_deleted.find(params[:id])

由于CanCanCan 的load_and_authorize_resourceload_and_authorize_resource,之后出现了一个新问题:它试图调用

 @area = Area.find(params[:id])

忽略 only_deleted 过滤器,导致错误,因为所选 ID 仅在 deleted_at 处找到不为空(未删除),并禁用授权 "fixes" 它,所以它一定是 CanCanCanParanoia 之间的问题。

这是一个具有完全相同问题的线程:https://github.com/rubysherpas/paranoia/issues/356

这是 Whosebug 上的新问题线程:

如果找到解决方案,我会再次更新,谢谢。

更新 2

问题已解决,可以在我上面提到的新问题线程中找到解决方案。

我以前也遇到过这个问题,我将解释我解决这个问题的方法..

概览: 鉴于我有一个名为 Items 的模型,我将有一个页面显示所有 Soft Deleted 个项目,我将调用 inactive.使用与 index action

相同的模板

首先你应该创建一条路线

  resources :items

    collection do
      get 'inactive'
    end

  end

其次你应该创建一个控制器动作...

  def inactive
    @Items = Items.only_deleted
    render action: :index
  end

第三,我将转到 ../items/inactive 它会显示活动或存档的 项目

你也可以在那之后使用...

<%= link_to "Archived Items", inactive_items_path %>

在您看来转到该页面

更新

这里我要提一下,使用 index 视图呈现 inactive Items 集合可能会导致链接断开。

views/items/index.html.erb

<td><%= link_to 'Show', merchant %></td>
<td><%= link_to 'Edit', edit_merchant_path(merchant) %></td>
<td><%= link_to 'Destroy', merchant, method: :delete, data: { confirm: 'Are you sure?' } %></td>

这样你就可以做出选择,是否选择将正常 项目的编辑链接分组 并将其放在部分中,然后将非活动链接分组并放入它在另一个局部中,然后根据正在呈现视图的动作来呈现局部。

选项 #2 是删除 render action: :index 行并创建一个单独的视图 inactive.html.erb 及其链接,这样您就不会头疼了。虽然这会违背 DRY 原则。

您可以使用 YourModel.readonly.find_with_deleted(params[:id])YourModel.readonly.with_deleted.find(params[:id])