2010-01-04 168 views
3

我注意到,在轨一个常见的错误检查线路:保存/保存到底是什么!做?

if @user.save! 

,而不是像

Save 
If Save is successful 
Blah 
Else 
Blah 
End 

所以我的理解:“如果@ user.save!”它既保存了对象,并且如果成功则返回true/false。如果我稍后调用它,例如:

@user.save! 
if @user.save! 
    blah 
end 

我是否执行保存查询两次?

+0

逻辑上,答案必须是“是”,但我不是Rails专家 – 2010-01-04 02:14:00

+0

不确定,如果对象中没有任何变化,您可能会发现第二次保存不打扰数据库。请确保检查是否有任何内容进入日志文件(开发环境中的logs/development.log) – 2010-01-04 02:22:59

回答

7

我承认有点不同,但仍然很重要。这里的文档相当不错:

保存!

随着保存!验证始终运行。如果它们中的任何一个失败,则引发ActiveRecord :: RecordInvalid。

节省(perform_validation =真)

如果perform_validation是真实的验证运行。如果其中任何一个失败,则取消操作并保存返回错误。如果标志是错误的,验证完全被绕过。有关更多信息,请参阅ActiveRecord ::验证。

所以,保存!不只是返回真或假,而且只有在成功时才是真实的,并且如果失败则会提出异议。

这种区分的目的是,用保存!你是能够赶上使用标准红宝石设施,这样做在你的控制器错误,而保存能够if子句你做使用标准相同。至少这就是我的想法。

+0

感谢Moritz。从上面的一个问题,鉴于我的最后一个例子,保存,然后使用“如果保存!”...它击中分贝两次? – Kevin 2010-01-04 04:14:34

+0

hm,根据我的理解,像AR这样的orm层也在优化东西,并且发送一个未修改的对象到数据库以便(重新)保存是......不是那么聪明,所以我的猜测是:-) – moritz 2010-01-04 06:06:08