Прежде всего следует отделить проверку входных данных от материала модели.Используйте некоторый отдельный слой, даже если это просто пустой класс, реализующий 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 для получения более подробной информации.