在Rails中实现gmail样式“撤消”的最佳方法是什么?

时间:2008-10-14 08:21:39

标签: ruby-on-rails activerecord gmail undo revert

我认为在销毁记录时使用“撤消”方法ala gmail 非常重要,而不是显示恼人的弹出窗口,“你确定吗? ”。

我实现这一点的方法是在模型中有一个“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

当我调用find方法时,我只需要添加一个条件来过滤掉“已删除”的foos。也许设置一个cron或后台任务来在一段时间后真正破坏“已删除”的foos。

适合我,易于实施,但我很好奇是否有更好的方法来实现此功能?也许有一个插件或宝石提供我不知道的?

5 个答案:

答案 0 :(得分:4)

确实有一些插件可以在Agile Web Development找到。

以下是与您的描述相符的插件的链接和摘要:

  1. Acts as Paranoid:让您的活动记录“偏执”。删除它们不会删除该行,但会设置deleted_at字段。查找重载以跳过已删除的记录。
  2. Acts as soft deletable:提供软删除ActiveRecord模型的功能。

答案 1 :(得分:0)

有一个文件here似乎可以满足您的要求,但我个人认为必须有一些内容可以自动过滤掉已删除的记录,除非您明确包含它们。这样,除非您包含一个重新包含它们的参数或命名范围,否则它们确实会被删除。

不幸的是,我没有写过一篇,而且业余时间有限,但不应该那么难,应该吗?

答案 2 :(得分:0)

您可以将已删除的项目移动到单独的集合(或表格或其他任何内容)中 - 然后查看原始列表中的任何内容都会看到它已被删除,并且您可以在方便的时候处理新列表。

答案 3 :(得分:0)

PaperTrail做得很好。它有一个很好的Railscast,虽然它现在有点老了。我知道很久以前就提出过这个问题,但我出于好奇而偶然发现了这个问题,并认为我应该参考一个不错的最新方法。

答案 4 :(得分:-1)

责任链模式

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