Как я проверяю координаты в моей модели Rails? - PullRequest
0 голосов
/ 11 марта 2019

Я создал приложение Rails, которое использует API геолокации HTML5 для получения текущей позиции пользователя. Я использую координаты, чтобы заполнить поле в моей форме. Я хочу знать, как проверить это в моей модели. Вот как выглядит моя форма ввода:

<%= f.input :start_point, label: false,  input_html: { id: 'coordinatesStart' } %>

Координаты должны быть в форме 54.678, 45.789 и могут принимать любое количество чисел после десятичной точки.

Есть идеи, как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Широта должна быть числом от -90 до 90 и долготой от -180 до 180.

Так в вашей модели:

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 голосов
/ 11 марта 2019

Прежде всего следует отделить проверку входных данных от материала модели.Используйте некоторый отдельный слой, даже если это просто пустой класс, реализующий ActiveModel :: Validations.

Затем добавьте отдельный класс валидатора, например:

class GeoPairValidator < ActiveModel::EachValidator
  RE = /\A\d+\.\d+, ?\d+\.\d+\z/

  def validate_each(record, attribute, value)
    # value should be "nn.nnnnnnn, nn.nnnnnnn"
    record.errors.add(attribute, :invalid, value: value) if value.to_s !~ RE

    # split by comma, convert to float
    v1, v2 = value.to_s.split(', ').map(&:to_f)

    # check logical bounds
    record.errors.add(attribute, :invalid, value: value) if v1.abs > 90
    record.errors.add(attribute, :invalid, value: value) if v2.abs > 180
  end
end

Наконец, используйте его в своемкласс ввода:

class YourInput
  include ActiveModel::Validations

  attr_accessor :start_point

  validates :start_point, geo_point: true
end

Также проверьте https://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates для получения более подробной информации.

0 голосов
/ 11 марта 2019

Я не могу запустить его сейчас, но попробуйте:

  validates :points, format: { with: /\d{1,}\.\d{1,},\s\d{1,}\.\d{1,}/, message: "please enter co-ordinates in correct format"}

Логика:

Совпадение, по крайней мере, с 1 номером, после которого следует десятичное число, за которым следуют 1 или более чисел, затем запятая, затем пробел, за которым следуют одно или несколько чисел, после которых следует десятичное число, за которым следуют одно или несколько чисел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...