私の Rails アプリでは、コントローラーの create アクションにトランザクション ブロックがあり、そこで 2 つのレコードを作成しようとしています。
def create
ActiveRecord::Base.transaction do
@foo = Foo.new(params[:foo].except(:bar))
raise ActiveRecord::Rollback unless @foo.save
@bar = Bar.new(params[:foo][:bar])
raise ActiveRecord::Rollback unless @bar.save
end
end
どの保存が失敗したかを示すエラーを返すことができるように、ロールバックからレスキューできるようにしたいと考えています。
rescue ActiveRecord::Rollback => e
@foo.errors = e if @foo.errors.blank?
ensure
respond_with @foo
end
しかし、レスキューブロックに入ることはありません。これは、Rails のドキュメントに記載されているように、トランザクション ブロックが Rollback 例外を食べて、それを再発生させないためだと思います。この例外を強制的に再発生させる方法はありますか?