Подтвердить что ты не робот

Рельсы делают откат, если я использую начало... спасения?

Я хотел бы добавить начальный... блок спасения в один из методов создания контроллеров, чтобы лучше узнать информацию и построить правильное сообщение об ошибке, чтобы вернуться к клиенту. Помогает ли спасение каким-либо образом "прерывать" процесс отката?

Я предполагаю, что рельсы автоматически откат. Когда это происходит? Это уже произошло к тому моменту, когда я попал в предложение о спасении?

Я использую mySQL на Dreamhost, и я думаю, что они используют innoDB.

4b9b3361

Ответ 1

Я экспериментировал с этим. Похоже, если ваше спасение поймает исключение, вызвавшее откат, часть транзакции, которая уже произошла, совершается. В моем случае я хочу, чтобы база данных вернулась к тому, как она была до начала транзакции, но я все еще хочу обработать исключение.

Я закончил с этим:

self.transaction do
  first_operation
  begin
    operation_that_might_violate_db_constraint
  rescue ActiveRecord::RecordNotUnique
      #deal with the error
      raise ActiveRecord::Rollback #force a rollback
  end
end

Часть raise ActiveRecord::Rollback гарантирует полную откат транзакции. Без него изменения от first_operation в конечном итоге будут совершены.

ActiveRecord:: Rollback - это особый вид исключения, который не пузырится выше уровня транзакции, поэтому вы не получите неперехваченное исключение, которое отображает страницу с ошибкой.

Я не уверен, что это золотой стандарт для этого, но, похоже, он работает.

Ответ 2

Простое использование begin... rescue недостаточно для отката транзакции. Вам необходимо использовать:

ModelName.transaction do 
end

Это делается явно при вызове сохранения, так что все ваши обратные вызовы выполняются вместе. Какие исключения вы ловите в своем спасательном блоке? На что вы отвечаете? Какие ошибки?

Ответ 3

Откат не обрабатывается.

Пример:

create_table "helps", :force => true do |t|
    t.string   "title",                           :null => false
    t.text     "content"
end

#Rails console
Help.transaction do
  Help.create! title: "aaa"
  begin
    Help.create! content: "111"
  rescue
    p "create error."
  end
  Help.create! title: "bbb"
end

#get this
>> "create error."
Help.count
>> 2

Ответ 4

Вы также можете попробовать мой ответ для отката, улова и рендеринга для вашего метода создания с помощью ActiveRecord:: Base.transaction: - Нажмите здесь

Спасибо