0
votes

Comment valider les coordonnées dans mon modèle de rails?

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' } %>


2 commentaires

Comptez-vous la longitude et la latitude comme des flotteurs ou est start_point une chaîne comme celle-ci "54.678, 45.789" ?


@spickermann start_point est une chaîne


3 Réponses :


0
votes

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"}


7 commentaires

99.99, 999.99.99 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 sera valide dans ce cas et 85.99, 178.81 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.



0
votes

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 }


0 commentaires

0
votes

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


0 commentaires