Обработка ошибок в транзакциях ActiveRecord?
Мне нужно создать строку в таблице как для билетов, так и для пользователей... Мне просто нужно знать, как обрабатывать, если транзакция терпит неудачу.
@ticket.transaction do
@ticket.save!
@user.save!
end
#if (transaction succeeded)
#.....
#else (transaction failed)
#......
#end
На стороне заметки я хотел бы поблагодарить всех, кто участвует в переполнении стека, чтобы помочь дизайнеру узнать больше программирования... Я ценю время, которое вы, ребята, вынимаете из своего дня, чтобы ответить на такие вопросы n00b:)
Ответы
Ответ 1
Если вы используете сохранение! метод с ударом (восклицательный знак), приложение будет генерировать исключение, когда сбой не удастся. Затем вам придется поймать исключение для обработки отказа.
begin
@ticket.transaction do
@ticket.save!
@user.save!
end
#handle success here
rescue ActiveRecord::RecordInvalid => invalid
#handle failure here
end
Ответ 2
для меня, используя Rails 2.3.8, лучшим решением было следующее:
#Important this have to be nil
result = nil
@ticket.transaction do
result[true, 'Well done']
result = [false, "Ticket can't be saved"] unless @ticket.save!
raise ActiveRecord::Rollback unless result[0]
result = [false, "User can't be saved"] unless @user.save!
raise ActionRecord::Rollback unless result[0]
end
if result[0]
flash[:notice] = result[1]
#...
else
flash[:warning] = result[1] + "<br> Not so well done"
end
Убедитесь, что u инициализирует результат как ноль, чтобы вы могли вносить изменения, сделанные внутри транзакции после отката!
Ответ 3
Я тоже новичок, но я считаю, что вы можете проверить @ticket.errors и @user.errors и проверить в соответствии с их ответами
также метод save должен возвращать логическое значение, определяющее успешное сохранение