Convertir la saisie de l'Utilisateur en entier
Donc j'ai un formulaire où l'utilisateur peut entrer un prix. Je suis en train de faire un before_validation qui normalise les données de détourage, le $ si l'utilisateur met.
before_validation do
unless self.price.blank? then self.price= self.price.to_s.gsub(/\D/, '').to_i end
end
Si les entrées de l'utilisateur $50 Ce code me donne 0. Si les entrées de l'utilisateur 50$ ce code me donne 50. Je pense que depuis le type de données integer, que rails est en cours d'exécution .to_i avant mon before_validation et coupant tout ce qui est après le $. Ce code fonctionne très bien si le type de données est une chaîne de caractères.
Que quelqu'un a une solution qui me permettra de garder le type de données entier?
OriginalL'auteur Robert | 2012-03-13
Vous devez vous connecter pour publier un commentaire.
Une solution est de remplacer le mécanisme sur le modèle qui fixe le prix, comme ceci:
Ainsi, lorsque vous vous
@model.price = whatever
, il va aller à cette méthode au lieu de les rails de l'attribut par défaut de l'écrivain. Ensuite, vous pouvez convertir le nombre et l'usagewrite_attribute
pour faire le travail d'écriture proprement dit (vous devez le faire de cette façon parce que la normeprice=
est maintenant cette méthode!).J'aime cette méthode meilleure, mais pour faire référence à une autre façon de le faire est à votre contrôleur avant de l'affecter au modèle. Le paramètre est une chaîne de caractères, mais le modèle est de convertir cette chaîne en nombre, afin de travailler avec le paramètre directement. Quelque chose comme ceci (juste l'adapter à votre contrôleur de code):
Pour l'une ou l'autre solution, supprimer
before_validation
.OriginalL'auteur Ben Lee
Je voudrais définir un champ virtuel et faire ma manipulation, il vous permettant de formater et modifier à la fois les getter et setter à volonté:
Vous pourriez aussi vouloir noter que:
Np. J'ai suggéré que l'approche parce que je ne suis pas un fan de la logique supplémentaire dans le contrôleur, et il y a de la clarté puisque vous n'êtes pas le remplacement d'un domaine qui, à première vue doit correspondre au champ db et je devine une chaîne de caractères n'est pas le type de données correct 🙂
Je voudrais créer d'autres présentateur de classe pour la mise en forme de logique ici
OriginalL'auteur offbyjuan
Mon soluction
colum prix type decimal
OriginalL'auteur gilcierweb