Rails 5 Paranoia - Как я могу "показать" удаленную запись?
После мягкого удаления записи я не могу вызвать ее на show
действие на контроллере, поскольку он ищет запись, соответствующую записи ID WHERE deleted_at IS NULLL
Это правильно, учитывая назначение драгоценного камня, но я все же хотел бы иметь возможность доступа к нему в своего рода "только длячтения" состоянии внутри приложения, чтобы позволить пользователю просматривать архив и, возможно, восстанавливать Это.
Как обойти область удаления, чтобы снова получить доступ к объекту?
ОБНОВЛЕНИЕ 1
По совету @slowjack2k я могу получить доступ к программно удаленным записям по следующему запросу:
@area = Area.only_deleted.find(params[:id])
Впоследствии возникла новая проблема из-за CanCanCan load_and_authorize_resource
: он пытается позвонить
@area = Area.find(params[:id])
игнорирование фильтра only_deleted, приводящего к ошибке, так как выбранный идентификатор обнаруживается только в том случае, если delete_at не является нулевым (не удаленным), и отключение авторизации "исправляет" его, поэтому это должно быть проблемой между CanCanCan и Paranoia.
Вот тема с точно такой же проблемой: https://github.com/rubysherpas/paranoia/issues/356
Вот новый поток вопросов о Stackru: совместимость Rails 5 между Paranoia и CanCanCan, скомпрометирована?
Я обновлю его снова решением, если найду его, спасибо.
ОБНОВЛЕНИЕ 2
Проблема была решена, и решение может быть найдено в новой ветке проблемы, которую я упомянул выше.
2 ответа
Ты можешь использовать YourModel.readonly.find_with_deleted(params[:id])
или же YourModel.readonly.with_deleted.find(params[:id])
Я бросил это раньше, и я объясню свой подход, чтобы решить это..
Обзор: если у меня есть модель с названием " Предметы", у меня будет страница, на которой будут отображаться все Soft Deleted
Предметы я назову неактивными. Используя тот же шаблон действия индекса
Сначала вы должны создать маршрут
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
Коллекцияпредметов может оставить вас с битыми ссылками.
просмотров / пункты / 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
с его ссылками и сохранить себе головную боль. Хотя это было бы против СУХОГО принципала.