mirror of
https://github.com/stripe/stripe-ruby.git
synced 2025-10-07 00:05:33 -04:00
Currently, with a normal API resource, you can unset fields by specifying a `nil` to that field's setter: ``` ruby c = Charge.retrieve('ch_123') c.customer = nil c.save ``` This actually gets serialized as the form `customer=` (i.e. an empty string), but we had to use the empty string to handle unsets because form encoding has no concept of a `nil`/`null`. To try and prevent usage errors, we actually prevent you from setting fields with an empty string: ``` ruby c = Charge.retrieve('ch_123') c.customer = '' # error! use nil instead ``` When specifying parameters though, this doesn't work anywhere nearly as well because usage patterns like this are very common in Ruby: ``` ruby charge_opts = { params[:amount], params[:currency], params[:customer], } charge = Charge.create(charge_opts) ``` Each one of `params` above may or may not be `nil`, so we've traditionally filtered those fields out during the invocation of `Charge.create`. Recently, I suggested to Slava that we may be able to change this behavior, and we ended up putting in a patch as part of #557. Users brought to my attention that this would be far too disruptive of a change in #560 though, and having thought about it more carefully, I agree. There's also an argument that filtered `nil` values are just a better API, especially in Ruby where patterns like the one above are frequently in effect. So the best thing I can think of currently is to leave things as they were before #557, and just require that users use an explicit empty string when passes in parameter hashes: ``` ruby Charge.update(customer: '') # will try to unset customer ``` Empty strings will continue to error for `StripeObject` fields like they always have. I don't think this is a perfect solution by any means (the different between values on `StripeObject` versus using parameters is weird), but it's the least disruptive thing that I can think of right now that gets us the functionality that we need for endpoints like `/v1/invoices/upcoming`. Fixes #560.