レールのいくつかのメソッドが無効な場合に例外を発生させるために、!
演算子を使用していることに気付きました。たとえば、User.create!
いつメソッドの例外を発生させたいのですか?
なぜこのようなものを使用したいですか?
ありがとうございました。
レールのいくつかのメソッドが無効な場合に例外を発生させるために、!
演算子を使用していることに気付きました。たとえば、User.create!
いつメソッドの例外を発生させたいのですか?
なぜこのようなものを使用したいですか?
ありがとうございました。
ActiveRecord will roll back a transaction if an exception is thrown while a transaction is active。
したがって、例外をスローするメソッドは、例外条件が発生したときにデータベースがトランザクションをコミットしないようにするために便利です。あなた自身で問題を "処理"できる場合、または実際には問題がない場合は、!
のないバリアントを使用し、エラー条件の戻り値を確認して、自分で処理してください。それがすでにある場合は、ユーザーが提供するユーザ名がまだピックアップし、別の名前を選択するユーザーのためのプロンプトを提供されていないかどうかを判断するためにUser.create
メソッドを使用する場合があります
User.create
のような特定の何かを 使用中で。
User.create!
メソッドを使用すると、ユーザーがフレンドリ名チェックをバイパスしようとした場合の整合性チェックでトランザクションの作成とロールバックが失敗することがあります。私はこの方法が成功したことを確認するかもしれませんが、私はここで扱うすべての実際のエラーを行うにはしたくない様々な理由
begin ... rescue ... end
がそれを明確にします。エラー状態の数が少なく、コール直後に完全に処理される場合は、例外を使用しないでステータスフラグを使用するのが良い理由があります。しかし、すべての技術はその場所と時間を持っています。
btwのsave
メソッドは内部的にsave!
を呼び出し、潜在的な例外を処理し、存在する場合はfalseを返します。実装については、the codeを参照してください。
Pedantic nit: '!'は演算子ではなく、メソッド名の一部です。問題のAPIに応じて、インプレース_データの_operateを意味することもあります。 – sarnold
それは本当にぺニチニックなニットではありません。 '! 'は演算子ですが、' create!'のようにメソッド名の一部であるときは*演算子ではありません。 –