У меня есть утверждение перечисление события в модели бронирования. У меня есть утверждение before_validation
в моей модели / booking.rb Я добавил пользовательскую проверку
include AASM
before_validation :item_availability, if: :approved?
enum status: [:pending, :approved, :rejected, :on_loan, :returned]
aasm column: :status, enum: true do
state :pending, initial: true
state :approved
state :rejected
state :on_loan
state :returned
event :approve do
transitions from: :pending, to: :approved
end
event :reject do
transitions from: :pending, to: :rejected
end
event :on_loan do
transitions from: :approved, to: :on_loan
end
event :returned do
transitions from: :on_loan, to: :returned
end
end
private
def item_availability
if item.quantity.to_f < quantity.to_f
errors.add(:base, "Not enough quantity for #{item.name} only #{item.quantity} left")
false
end
end
и в моем контроллере я звоню в сервис
@service = Manage::BookingApprovalService.new({booking: @booking})
@service.run
приложение / услуги / управление / booking_approval_service
class Manage::BookingApprovalService < BaseService
attr_accessor :booking
def run
Booking.transaction do
booking.approve! // I confirmed that I'm getting the false here
booking.item.decrement!(:quantity, booking.quantity)
BookingsMailer.send_approval(booking).deliver_now
end
end
end
Я получаю ложь, когда отлаживаю booking.approve! , потому что количество, указанное в бронировании, превышает количество товара.
Но из службы. декремент! и send_approval mail все еще вызывается.
Почему сервис не откатывается, если я получаю ложь от booking.approve!