Какой лучший способ реализовать "отмену" стиля Gmail в Rails?

Я думаю, что важно уничтожить " отменить" ala gmail при уничтожении записей вместо отображения раздражающего всплывающего окна, в котором говорится: "Вы уверены?".

Способ, которым я реализовал это, - иметь столбец timestamp "deleted_at" в модели, который получает отметку времени, когда метод destroy называется

def destroy
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, Time.now)
  ...
end

Чтобы вернуть/отменить, я просто поставлю тот же столбец в nil

def revert
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, nil)
  ...
end

Мне просто нужно добавить условие, чтобы отфильтровать "удаленные" foos, когда я вызываю метод find. Возможно, задание cron или background действительно уничтожить "удаленные" foos через некоторое время.

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

Ответы

Ответ 1

Есть действительно некоторые плагины, которые можно найти на Agile Web Development.

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

шаблон цепи ответственности

class Action
{
  Perform(context);
  Undo(context);
}