什么时候在模型中使用‘ save’vs‘ save?

根据 保住你的脑袋,积极的记录会让你发疯,我们应该避免在特殊情况下使用 save!rescue习语。假设一个模型需要 @post.mark_rejected

如果 mark_rejected中的代码由于以下问题之一而失败,是否应该引发异常:

  • 如果存在验证问题
  • 如果一个非空字段被赋值为 null
  • 如果与数据库的连接丢失

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

  • 控制器操作必须检查返回值 mark_rejected并执行它的操作
  • 我们并不期望这个方法调用会发生异常,所以我们不会在控制器操作中写入 rescue子句,因此异常会冒泡到(。.随便哪里。.)并且可能显示为一些(500 HTTP?)错误

示例代码:

def mark_rejected
...
save!
end

或者

def mark_rejected
...
save
end
83608 次浏览

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

检查返回值是否为 false 的代码行数比拯救异常少,所以如果您已经必须拯救异常,那么检查返回值没有什么问题。在实践中,save!抛出的异常需要多长时间冒泡一次调用堆栈?根据我的经验,很少。

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

如果没有成功,save!将引发错误。

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

建议: 在最后一行使用 save,否则使用 save!

这个想法是: 如果方法返回保存的结果,你不应该抛出异常,让调用者来处理保存问题,但是如果保存被隐藏在模型方法逻辑中,你会希望在失败的情况下用异常中止进程。