Как лучше всего реализовать «отмену» в стиле Gmail в Rails?
-
03-07-2019 - |
Вопрос
Я считаю, что важно иметь "отменить"метод аля Gmail при уничтожении записей вместо отображения раздражающего всплывающего окна с сообщением: "Вы уверены?".
Я реализовал это следующим образом: в модели есть столбец временной метки «deleted_at», который получает временную метку, когда разрушать метод называется
def destroy
@foo = Foo.find(params[:id])
@foo.update_attribute(:deleted_at, Time.now)
...
end
К вернуть/отменить Я просто установлю тот же столбец равным нулю
def revert
@foo = Foo.find(params[:id])
@foo.update_attribute(:deleted_at, nil)
...
end
Мне просто нужно добавить условие для фильтрации «удаленных» foos при вызове метода find.Возможно, установите cron или фоновую задачу, чтобы через некоторое время действительно уничтожить «удаленные» foos.
У меня работает и легко реализуется, но мне интересно, есть ли лучший способ реализовать эту функцию?Может быть, есть плагин или драгоценный камень, который обеспечивает это, о котором я не знаю?
Решение
Действительно, некоторые плагины можно найти по адресу Гибкая веб-разработка.
Вот ссылки и описания плагинов, которые, похоже, соответствуют вашему описанию:
- Действует как параноик:Сделайте свои активные записи "параноидами". Удаление их не удаляет строку, но устанавливает поле deleted_at.Поиск перегружен для пропуска удаленных записей.
- Действует как мягко удаляемый:Предоставляет возможность мягкого удаления моделей ActiveRecord.
Другие советы
Есть файл здесь Кажется, это делает то, что вам нужно, но лично я думаю, что должно быть что-то, что автоматически отфильтровывает удаленные записи, если вы их специально не включаете.Таким образом, они действительно будут выглядеть удаленными, если вы не добавите параметр или именованную область, которая их повторно включает.
К сожалению, я не написал ни одного, а свободное время ограничено, но это не должно быть так уж сложно, не так ли?
Вы можете переместить удаленные элементы в отдельную коллекцию (или таблицу, или что угодно) — тогда все, что посмотрит в исходный список, увидит, что оно удалено, и вы сможете разобраться с новым списком, когда вам будет удобно.
БумагаСлед делает это прекрасно.Есть хороший Рейлскаст на нем, хотя он уже немного устарел.Я знаю, что этот вопрос был задан довольно давно, но я наткнулся на него из любопытства и подумал, что мне следует указать хороший современный способ сделать это.
Схема цепочки ответственности
class Action
{
Perform(context);
Undo(context);
}