在Rails 3中,widget.save
和 widget.save!
是用于持久化模型对象的两种方法,它们的核心区别在于错误处理方式:
widget.save
返回 true
(保存成功)或 false
(验证失败/保存错误),不会抛出异常。
需通过 widget.errors
手动检查错误信息。widget.save!
保存成功返回 true
,失败则抛出 ActiveRecord::RecordInvalid
异常。
异常中包含完整的错误信息(通过 exception.record.errors
访问)。| 特性 | save
| save!
|
|---------------------|----------------------|--------------------------|
| 返回值 | 布尔值 | 布尔值或抛出异常 |
| 错误处理 | 静默失败 | 显式抛出异常 |
| 适用场景 | 需要手动处理错误逻辑 | 需要中断流程或统一异常处理 |
# 使用 save(需手动检查错误)
widget = Widget.new(name: nil)
if widget.save
puts "保存成功"
else
puts "错误: #{widget.errors.full_messages.join(', ')}"
end
# 使用 save!(通过异常处理)
begin
widget.save!
rescue ActiveRecord::RecordInvalid => e
puts "错误: #{e.record.errors.full_messages.join(', ')}"
end
save
更适合:save!
更适合:rescue_from
)。Q: 为什么有时用 save!
但没看到异常?
A: 可能被上层代码的 rescue
捕获,或模型验证通过(如字段均有默认值)。
Q: 性能差异? A: 无显著差异,选择取决于业务逻辑需求。
没有搜到相关的文章