Какой лучший способ реализовать "отмену" стиля 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);
}