Как лучше всего реализовать «отмену» в стиле Gmail в Rails?

StackOverflow https://stackoverflow.com/questions/200372

Вопрос

Я считаю, что важно иметь "отменить"метод аля 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.

У меня работает и легко реализуется, но мне интересно, есть ли лучший способ реализовать эту функцию?Может быть, есть плагин или драгоценный камень, который обеспечивает это, о котором я не знаю?

Это было полезно?

Решение

Действительно, некоторые плагины можно найти по адресу Гибкая веб-разработка.

Вот ссылки и описания плагинов, которые, похоже, соответствуют вашему описанию:

  1. Действует как параноик:Сделайте свои активные записи "параноидами". Удаление их не удаляет строку, но устанавливает поле deleted_at.Поиск перегружен для пропуска удаленных записей.
  2. Действует как мягко удаляемый:Предоставляет возможность мягкого удаления моделей ActiveRecord.

Другие советы

Есть файл здесь Кажется, это делает то, что вам нужно, но лично я думаю, что должно быть что-то, что автоматически отфильтровывает удаленные записи, если вы их специально не включаете.Таким образом, они действительно будут выглядеть удаленными, если вы не добавите параметр или именованную область, которая их повторно включает.

К сожалению, я не написал ни одного, а свободное время ограничено, но это не должно быть так уж сложно, не так ли?

Вы можете переместить удаленные элементы в отдельную коллекцию (или таблицу, или что угодно) — тогда все, что посмотрит в исходный список, увидит, что оно удалено, и вы сможете разобраться с новым списком, когда вам будет удобно.

БумагаСлед делает это прекрасно.Есть хороший Рейлскаст на нем, хотя он уже немного устарел.Я знаю, что этот вопрос был задан довольно давно, но я наткнулся на него из любопытства и подумал, что мне следует указать хороший современный способ сделать это.

Схема цепочки ответственности

class Action
{
  Perform(context);
  Undo(context);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top