C'est une question tellement stupide que j'ai l'impression d'avoir raté quelque chose de simple. J'ai un formulaire avec un quantity
champ. Les gens continuent à taper des virgules lorsqu'ils saisissent la quantité (par exemple, ils tapent 12,000
pour indiquer douze mille), je voudrais donc supprimer les virgules avant d'enregistrer la quantité ( 12000
dans l'exemple) dans une colonne de nombres entiers dans la base de données.
Jusqu'à présent, j'ai essayé deux méthodes. Remplacer la méthode setter comme suggéré dans cette question SO
def quantity=(num)
num.gsub!(',', '') if num.is_a?(String)
self[:quantity] = num.to_i
end
Cela fonctionne dans un sens. Si je tape 12,000
dans le champ quantité et soumettre le formulaire, j'obtiens 12000
dans la base de données. Le problème est que cela contourne également toutes les quantity
validations. Je ne peux plus valider la présence d'une valeur pour la quantité par exemple. Ce n'est pas bon.
J'ai également essayé d'utiliser un rappel de validation avant (au lieu de remplacer le paramètre) :
before_validation :sanitize_quantity
def sanitize_quantity
# Doesn't wok because quantity.to_i already called by this point.
end
Cela ne fonctionne pas car le temps que la quantité atteigne la méthode de rappel, Rails a déjà appelé to_i
sur elle. Cela signifie que 12,000
sera tronqué à 12
au moment où il atteint le callback. Encore une fois, ce n'est pas bon.
Que puis-je faire d'autre à part supprimer les virgules du côté client ?
Pour finir, je suis conscient que c'est essentiellement une chose stupide à faire parce que certains pays utilisent les points et les virgules de manière différente. Je dois quand même le faire.