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

Обработка ошибок в транзакциях ActiveRecord?

Мне нужно создать строку в таблице как для билетов, так и для пользователей... Мне просто нужно знать, как обрабатывать, если транзакция терпит неудачу.

@ticket.transaction do
    @ticket.save!
    @user.save!
end
    #if (transaction succeeded)
        #.....
    #else (transaction failed)
        #......
    #end

На стороне заметки я хотел бы поблагодарить всех, кто участвует в переполнении стека, чтобы помочь дизайнеру узнать больше программирования... Я ценю время, которое вы, ребята, вынимаете из своего дня, чтобы ответить на такие вопросы n00b:)

4b9b3361

Ответ 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 должен возвращать логическое значение, определяющее успешное сохранение