Ruby on Rails: как мне перехватить ActiveRecord :: Rollback? - PullRequest
2 голосов
/ 12 сентября 2010

В моем контроллере есть код, который выглядит следующим образом:

    @mymodel.transaction do 
      for a in arr
        @mymodel.some_method(a)
      end
    end

in @ mymodel # some_method Я мог бы выдать исключение ActiveRecord::Rollback, которое в БД делает то, что ему нужно, однако затем я просто получаю HTTP 500 и не могу перехватить исключение, чтобы сообщить пользователю об Кстати, что пошло не так.

Я пытался обернуть @ mymodel.transaction do в блок begin / rescue, но это тоже не сработает. Каков наилучший способ отловить исключение, чтобы я мог представить пользователю правильное представление?

1 Ответ

2 голосов
/ 12 сентября 2010

Из документации ActiveRecord::Base:

Как правило, создание исключения вызывает метод transaction для отката транзакции базы данных и для передачи исключения. Но если вы вызовете исключение ActiveRecord :: Rollback, транзакция базы данных будет отменена без передачи исключения.

Небольшой пример:

class ThrowController < ApplicationController
  def index
      status = ActiveRecord::Base.connection.transaction do
        raise ActiveRecord::Rollback.new
      end

      Rails.logger.info "followed transaction"
  end
end

, то:

>> c = ThrowController.new.index
=> "followed transaction \n"

Как видите, исключение ActiveRecord:::Rollback поглощено блоком transaction.

Мне кажется, что с вашим кодом происходит что-то еще, о чем мы не знаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...