所以我知道bang(感叹号)和非bang方法之间的区别通常是方法是修改对象本身还是返回一个单独的修改对象,保持原始状态不变。
然后在本书第6章中构建用户模型时,我遇到了User.create
方法,该方法创建了一个新模型并将其保存到数据库中。在Michael Hartl的 Ruby on Rails 3 Tutorial 中,他写道User.create!
方法“就像create
方法一样......除了它引发了一个 ActiveRecord: :如果创建失败,则记录无效异常。“
我很困惑。 User.create!
方法是不遵循Ruby“bang-convention”还是我完全遗漏了某些东西?如果他遵循约定,User.create!
如果是类方法,如何修改self?
答案 0 :(得分:65)
虽然很多课程将爆炸方法视为“修改对象的方法”,但我更喜欢Eloquent Ruby book中对爆炸方法的描述:
在实践中,Ruby程序员保留 !装饰方法的名称 意想不到的东西,或者可能是一些 危险
因此,在这种情况下,“意外”结果是引发异常而不是仅失败并返回false
。
答案 1 :(得分:14)
希望这也有帮助:
如果记录无效,爆炸版本(例如save!)会引发异常。非爆炸版本不会:save和update_attributes返回false,创建和更新只返回对象。
编辑:更改了源以修复损坏的链接