ユーザモデルにinvite!
というメソッドがあり、ユーザーのために一意のトークンを生成し、自分のアプリケーションに参加/登録するための電子メールを送信します。Railsモデルのデータベーストランザクションのエラーを正しく処理する
簡素化実装がある -
class User < ActiveRecord::Base
# ...
# ...
def invite!
transaction do
generate_invitation_token
mark_as_invited
save!
end
WelcomeMailer.delay.send_invitation(id)
end
end
あなたが見ることができるように、それはトランザクション内、いくつかのセットアップ手順を行い、その後、WelcomeMailer
招待状を送信します。
ここで重要な点は、トランザクション中にデータベースを更新する際に問題がある場合は、電子メールを配信したくないということです。
ここでエラー処理を実装するにはどうすればよいですか?
ルビレベルのメソッドでエラーが発生する可能性があります。たとえば、
save!
は、一部のモデル検証のためにエラーが発生する可能性があります。その場合はメーラーに届く前にrescue
とreturn
ができます。DBレベルのトランザクションでエラーが発生した場合はどうなりますか?ルビーにバブルアップしてエラーを投げますか?同じ
begin..rescue
アプローチも同様に働くのでしょうか?
ありがとう!あなたのケースについて