class GeojsonFormatValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) if value.present? geojson = parse_json(value) unless geojson?(geojson) record.errors.add(attribute, :invalid) end end end private def parse_json(geojson_data) JSON.parse(geojson_data) rescue nil end def geojson?(geojson) return false unless geojson.is_a?(Hash) geojson.dig("geometry", "coordinates").is_a?(Array) end end