Last Updated: 2021-05-16
I had the following code for handling refunds:
refund_instructions.map do |line_item_id, amount_to_refund| [ LineItem.find(line_item_id).purchasable, BigDecimal(amount_to_refund) ] end
On the front-end was a form where you see all the various line-items and you input the amounts you are supposed to refund for each of the potentially many line items in the order.
When the form is submitted, it is treated as collection of strings by Ruby on Rails, eventually
ending up as the
The input field corresponding to
amount_to_refund defaults to "0.0" in the
front-end form, so this default was what usually got passed to the backend.
But one time I erased the 0.0, causing "" (blank string) to be submitted by the form. This triggered the bug... it had never been tested after a user deleted the form default.
The cause of the bug was that
BigDecimal is fussy about the conversions it can
handle. This follows on from Ruby being strongly typed.
Generally I should never assume that a number converter knows what to do with blank strings or nils. Always test.
[ LineItem.find(line_item_id).purchasable, BigDecimal(amount_to_refund.blank? ? 0 : amount_to_refund) ]