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_resource
load_and_authorize_resource
,之后出现了一个新问题:它试图调用
@area = Area.find(params[:id])
忽略 only_deleted 过滤器,导致错误,因为所选 ID 仅在 deleted_at 处找到不为空(未删除),并禁用授权 "fixes" 它,所以它一定是 CanCanCan 和 Paranoia 之间的问题。
这是一个具有完全相同问题的线程: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])
软删除记录后,我无法在控制器上的 show
操作上调用它,因为它会查找与记录的 ID WHERE deleted_at IS NULLL
匹配的记录,这是正确的gem 的目的,但我仍然希望能够在应用程序中以某种“只读”状态访问它,以便允许用户查看存档并可能恢复它。
如何绕过删除范围才能再次访问该对象?
更新 1
根据@slowjack2k 的建议,我可以通过以下查询访问软删除的记录:
@area = Area.only_deleted.find(params[:id])
由于CanCanCan 的load_and_authorize_resource
load_and_authorize_resource
,之后出现了一个新问题:它试图调用
@area = Area.find(params[:id])
忽略 only_deleted 过滤器,导致错误,因为所选 ID 仅在 deleted_at 处找到不为空(未删除),并禁用授权 "fixes" 它,所以它一定是 CanCanCan 和 Paranoia 之间的问题。
这是一个具有完全相同问题的线程: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])