web-dev-qa-db-ja.com

Rails-createおよびcreate!メソッド、FoR ​​3チュートリアル

ですから、bangメソッド(感嘆符)と非bangメソッドの違いは、通常、メソッドがオブジェクト自体を変更するか、元の変更せずに別の変更されたオブジェクトを返すかです。

次に、本の第6章でユーザーモデルを作成しているときに、User.createメソッド。新しいモデルを作成し、1つのステップでデータベースに保存します。 Michael HartlのRuby on Rails 3 Tutorial)で、彼はUser.create!メソッド "createメソッドと同じように動作します...ただし、作成が失敗した場合にActiveRecord :: Record-Invalid例外が発生する点が異なります。"

私はかなり混乱しています。それは User.create!メソッドに従わないRuby "bang-convention"または完全に何かが足りないのですか?そして、もし彼がIS規則に従っている場合、User.create!クラスメソッドの場合、自分自身を変更しますか?

37
Kvass

多くのクラスはbangメソッドを「オブジェクトをインプレースで変更するメソッド」として扱いますが、私は Eloquent Ruby book より良いbangメソッドの説明が好きです:

実際には、Rubyプログラマは!

したがって、この場合、「予期しない」結果は、単に失敗してfalseを返すのではなく、例外が発生することです。

67
Dylan Markow

これも役立つことを願っています:

Bangバージョン(例:save!)では、レコードが無効な場合に例外が発生します。非bangバージョンではありません。saveおよびupdate_attributesはfalseを返し、createおよびupdateはオブジェクトを返すだけです。

出典: http://edgeguides.rubyonrails.org/active_record_validations.html#when-does-validation-happen-questionmark

編集:リンク切れを修正するためにソースを変更しました

14
KcC0