Rails AASM не откатывается, когда валидация возвращает false - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть модель бронирования, которая меняет статус с помощью AASM

Модели / booking.rb

before_validation :item_availability, if: -> { pending? || approved? }

enum status: [:pending, :approved, :rejected, :on_loan, :returned]

aasm column: :status, enum: true, whiny_transitions: true do
  state :pending, initial: true 
  state :approved

  event :approve do
    transitions from: :pending, to: :approved
  end
end

private
 def item_availability
    if quantity.to_f > item.quantity.to_f
      errors.add(:base, "Not enough quantity for #{item.name} only #{item.quantity} left")
      false
    end
  end

и у меня есть служба, которая вызывает утверждение! событие

  def run
    booking.transaction do
      booking.approve! 
      booking.item.decrement!(:quantity, booking.quantity)
      BookingsMailer.send_approval(booking).deliver_now
    end
  rescue ActiveRecord::RecordInvalid => e
    errors.add(:base, e.message)
    false
  end

Проблема здесь в том, что проверка выполняется, потому что количество больше, чем количество бронирования, но транзакция в моем сервисе не откатывается.

Согласно документации

Сохранение включает в себя запуск всех проверок в классе Job. Если Флаг whiny_persistence установлен в true, исключение возникает в случае отказ.

Я уже установил для whiny_transitions значение true, но

...