-
Notifications
You must be signed in to change notification settings - Fork 386
Fix thousand separator issue in validation #712
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Fix thousand separator issue in validation #712
Conversation
e060d29 to
dc4bc08
Compare
| @@ -0,0 +1,91 @@ | |||
| module MoneyHelpers | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My two cents: I prefer longer specs to the extra indirection of adding these custom expectation methods. But I understand that this is quite a personal preference.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, maybe I got a little carried away when I wrote all these changes. But I think I wanted them to be reusable and only require a single method call, at least for simple cases. I could still remove them if it's too much.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I'd tend towards removing them, thank you! 🙏🏻
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've already remove the MoneyHelper
Co-authored-by: Sunny Ripert <sunny@sunfox.org>
…efining product setup
When validating a model with a monetized field retrieved from the database, a validation error is raised if the field is not set before the model is validated when a validation with a limit is applied, regardless of whether the monetized field already has a value. For example:
This issue occurs specifically with currencies that use a dot (.) as a thousand separator, such as EUR. Consider a scenario where a product with a price of 1,200 EUR is retrieved from the database. When attempting to validate it, a validation error occurs due to the numericality limit:
During the validation process, the
MoneyValidator#validate_eachmethod is invoked to verify whetherraw_value.nil? && record.public_send(subunit_attr)is true. When this condition is true,raw_valueis calculated assubunit_value.to_f / currency.subunit_to_unit, resulting in a float value.Subsequently, when the
generate_detailsmethod is called, it determines the currency's thousand separator in order to instantiate theDetailsobject. For currencies that use a dot (.) as a thousand separator, theDetailsobject, when passed to thenormalizemethod, converts theraw_valueto a string and removes the thousand separator.This conversion process results in the original float value of
120.0forraw_valuebeing transformed into the string'120.0'. However, after the thousand separator is removed, this string is misinterpreted as'12000', ultimately resulting in a validation failure when a numericality limit is enforced.Proposed Solution
Replace the following code:
with this code:
This change ensures that if the before_type_cast attribute is nil, the method will call the attribute directly to retrieve the current value. Since the retrieved value is a Money object, it is correctly formatted when converted to a string, avoiding the issue caused by misinterpretation of the thousand separator.
Changes included in this PR: