什么时候在模型中使用`save`和`save!`?

时间:2011-02-20 10:16:22

标签: ruby-on-rails-3

根据save bang your head, active record will drive you mad,我们应该避免在特殊情况下使用save!rescue成语。鉴于此,假设模型需要@post.mark_rejected

如果mark_rejected中的代码由于下列问题之一而失败,是否应该抛出异常? :

  • 如果存在验证问题
  • 如果为非可空字段分配了空
  • 如果连接丢失到数据库

如果我们不抛出异常,那么:

  • 控制器操作必须检查mark_rejected的返回值并执行此操作
  • 我们不期待该方法调用的异常,因此我们不在控制器操作中编写rescue子句,因此异常冒泡到(.. wherever ..)并且可能会显示为一些(500 HTTP?)错误

示例代码:

def mark_rejected
  ...
  save!
end

def mark_rejected
  ...
  save
end

3 个答案:

答案 0 :(得分:126)

如果不成功,

save!会引发错误。

save将返回布尔值,如true或false。

答案 1 :(得分:20)

异常中有更多的开销,因此存在性能问题,特别是当可能会出现这种情况时,可能会经常抛出它,就像save一样。

检查返回值是否为假而不是抢救异常的代码行数较少,因此如果您已经必须解除异常,我不会看到如何检查返回值是一个问题。 save!抛出的异常多久会在实践中冒出调用堆栈?根据我的经验,很少,如果有的话。

如果在调用save而不是save!时抛出异常,您应该希望它显示500错误页面,因为发生了这样的事情:一个不可恢复的,未知的,意外的内部服务器错误。 / p>

答案 2 :(得分:3)

建议:当它在最后一行时使用save;否则save!

这个想法:如果方法返回了save的结果,你不应该抛出异常并让调用者处理存储问题,但如果保存被隐藏在模型方法逻辑中,你可能想要中止该进程,例外情况失败。