J'ai construit une application Rails qui utilise l'API de géolocalisation HTML5 pour obtenir la position actuelle d'un utilisateur. J'utilise les coordonnées pour peupler un champ sous ma forme. Je veux savoir comment valider cela dans mon modèle. Voici ce que mon apport de formulaire ressemble à:
<%= f.input :start_point, label: false, input_html: { id: 'coordinatesStart' } %>
3 Réponses :
Je ne peux pas l'exécuter maintenant, mais essayez:
validates :points, format: { with: /\d{1,}\.\d{1,},\s\d{1,}\.\d{1,}/, message: "please enter co-ordinates in correct format"}
99.99, 999.99.99 code> sera valide avec cette regex
Je n'ai pas réalisé que c'était censé être invalide? Il suffit d'ajouter dans la limite supérieure pour la plage requise
/\d {1,2}\.\d {1,1,.2}\.Ond {1,2}/. Dans ce cas
99.99, 56.12 code> sera valide dans ce cas et
85.99, 178.81 code> sera invalide
Allons-nous simplement continuer à inventer de nouvelles règles pour que je résolve? :)
Pas de nouvelles règles. Ce sont des géocœportines et votre regex n'est pas bon.
Les exigences étaient les suivantes: les coordonnées devraient être le formulaire 54.678, 45.789 et prendre toute quantité de chiffres après le point décimal. Personne n'a rien mentionné à propos de la taille des chiffres avant le point.
La latitude doit être un nombre compris entre -90 et 90 et la longitude entre -180 et 180.
Donc dans votre modèle: P>
GEOCOORDINATES_REGEX = /\A-?(?:90(?:(?:\.0*)?)|(?:[0-9]|[1-8][0-9])(?:(?:\.\d*)?)),\s-?(?:180(?:(?:\.0*)?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.\d*)?))\z/.freeze validates :start_point, format: { with: GEOCOORDINATES_REGEX }
La première chose devrait être de séparer la validation d'entrée du modèle. Utilisez une couche séparée, même si c'est juste une classe nue implémentant ActiveModel :: Validations.
Ensuite, ajoutez une classe de validateur autonome comme: P>
class YourInput include ActiveModel::Validations attr_accessor :start_point validates :start_point, geo_point: true end
Comptez-vous la longitude et la latitude comme des flotteurs ou est
start_point code> une chaîne comme celle-ci
"54.678, 45.789" code>?
@spickermann
start_point code> est une chaîne