48

所以我知道 bang(感叹号)和非 bang 方法之间的区别通常是该方法是修改对象本身还是返回一个单独的修改后的对象,保持原始对象不变。

然后,在本书第 6 章中构建用户模型时,我遇到了一个User.create方法,该方法可以创建一个新模型并将其保存到数据库中。在 Michael Hartl 的Ruby on Rails 3 教程中,他写道,该User.create!方法“与该create方法一样工作......除了它在创建失败时引发ActiveRecord::Record-Invalid异常”。

我很困惑。该User.create!方法是不是遵循 Ruby “bang-convention”,还是我完全遗漏了什么?如果他遵循惯例,User.create!如果它是类方法,如何修改 self ?

4

2 回答 2

79

尽管许多类将 bang 方法视为“一种在适当位置修改对象的方法”,但我更喜欢Eloquent Ruby 书中对 bang 方法的描述:

在实践中,Ruby 程序员保留!装饰做一些意想不到的事情的方法的名字,或者可能有点危险

所以在这种情况下,“意外”的结果是引发了异常,而不是仅仅失败并返回false

于 2011-06-11T16:28:44.693 回答
18

希望这也有帮助:

如果记录无效,爆炸版本(例如保存!)会引发异常。非爆炸版本不会:save 和 update_attributes 返回 false,create 和 update 只返回对象。

资料来源:http ://edgeguides.rubyonrails.org/active_record_validations.html#when-does-validation-happen-questionmark

编辑:更改源以修复断开的链接

于 2013-06-17T13:10:44.620 回答