Однажды в тени звезд. Фантастика. (15 март 2025)
Сотрудники загадочного Института Психологии задумали перестроить сознание обитателей планеты, устранив границы «я» и «не-я», пока процессоры Общемирового Компьютерного Радиуса шептались в своих локальных сетях. Но что-то пошло не так — и голоса зазвучали вразнобой.
Sypex Geo на Ruby on Rails
- Aleksej
-
Автор темы
- Не в сети
- Модератор
-
Отметил ряд несоответствий при использовании одной и той же базы Sypex Geo через различные адаптеры - PHP и Rails, посредством которых на одинаковый запрос БД возвращает различные значения. Списался с разработчиком гема, информация следующая: при портировании алгоритма с PHP был "зацеплен" баг с бинарным поиском, в дальнейшем баг был пофиксен одним из пользователей GitHub. На rubygems этого фикса нет, поэтому устанавливать гем оптимально именно с github (редактируем Gemfile):
Если в мастере ситуация повторится - нужно будет дебажить поиск по индексу ( github.com/kolesnikovde/sypex_geo/blob/m...geo/database.rb#L105 ), сверяясь с PHP библиотекой.
Да, ещё один момент - код ruby библиотеки соответствует SypexGeo 2.2.3 (единственная публичная, которую можно найти на сайте), и я не уверен, что она актуальна.
К сожалению, по моим наблюдениям, кардинальных улучшений это не дает. Например, старый gem определяет координаты proxy следующим образом:
ревизия с гитхаба позволяет чуть приблизиться к реальному геотаргетингу:
, и только php API дает правильный результат, причем во всех трех случаях использовалась одна и та же база данных Sypex Geo:
Использовать, таким образом, gem 'sypex_geo' на продакшне не представляется возможным, просьба отнестись к представленному в блоге материалу сугубо как к учебному пособию, и не более. Впрочем, есть вариант юзать на rails при определении геотаргетинга REST API Sypex Geo.
For example, убираем из Gemfile - gem 'sypex_geo' - и делаем контроллер похожим на следующие строчки кода:
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

- Aleksej
-
Автор темы
- Не в сети
- Модератор
-
JSON.parse("null") # nil , а обязана выдавать всегда Hash, соответственно, можно попробовать что-то вроде:
Code:def response_body reload: false, reraise: false return @_response_body if !reload && @_response_body @_response_body = JSON.parse(response.body) || {} rescue => e reraise ? raise(e) : {} end
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.