何时在模型中使用`save`和`save!`?
根据保存你的脑袋,积极的logging会让你发疯 ,我们应该避免使用save!
并在特殊情况下rescue
成语。 鉴于这一点,说一个模型需要@post.mark_rejected
。
如果mark_rejected
的代码由于以下问题之一而失败,应抛出exception吗? :
- 如果有validation问题
- 如果一个非空字段被赋值为null
- 如果有数据库连接丢失
如果我们不抛出exception,那么:
- 控制器的行动将不得不检查
mark_rejected
返回值,并做它的事情 - 我们并不期望从该方法调用中产生一个exception,所以我们不会在控制器动作中写一个
rescue
子句,因此这个exception冒泡到(..where)..并且可能会显示为一些(500 HTTP?)错误
示例代码:
def mark_rejected ... save! end
要么
def mark_rejected ... save end
在exception情况下会有更多的开销,所以存在一个性能问题,特别是在预计可能会经常抛出的情况下(比如save
。
这是更less的代码行来检查返回值是否比救援一个exception是错误的,所以我不明白如果你已经不得不抢救这个exception是如何检查返回值的问题。 多久save!
一次exceptionsave!
在练习中有没有必要冒出呼叫栈? 很less,如果有的话,根据我的经验。
如果在调用save
时抛出exception,而不是save!
你应该希望它显示一个500错误页面,因为这是发生了什么:一个不可恢复的,未知的,意外的内部服务器错误。
save!
如果不成功,将会引发错误。
save
将返回true或false。