×
OpenWeatherMap API: еще один погодный информер на Ruby on Rails (28 июнь 2017)

Возможно, любители и знатоки Joomla заинтересуются иным MVC-фреймворком, имя которому - Ruby on Rails?

Важно Sypex Geo на Ruby on Rails

Больше
1 нед. 2 дн. назад - 1 нед. 16 ч. назад #1 от Aleksej
Aleksej создал эту тему: Sypex Geo на Ruby on Rails
К материалу блога Sypex Geo на Ruby on Rails .

Отметил ряд несоответствий при использовании одной и той же базы Sypex Geo через различные адаптеры - PHP и Rails, посредством которых на одинаковый запрос БД возвращает различные значения. Списался с разработчиком гема, информация следующая: при портировании алгоритма с PHP был "зацеплен" баг с бинарным поиском, в дальнейшем баг был пофиксен одним из пользователей GitHub. На rubygems этого фикса нет, поэтому устанавливать гем оптимально именно с github (редактируем Gemfile):

gem 'sypex_geo', :git => 'git://github.com/kolesnikovde/sypex_geo.git'

Если в мастере ситуация повторится - нужно будет дебажить поиск по индексу ( github.com/kolesnikovde/sypex_geo/blob/m...geo/database.rb#L105 ), сверяясь с PHP библиотекой.

Да, ещё один момент - код ruby библиотеки соответствует SypexGeo 2.2.3 (единственная публичная, которую можно найти на сайте), и я не уверен, что она актуальна.


К сожалению, по моим наблюдениям, кардинальных улучшений это не дает. Например, старый gem определяет координаты proxy следующим образом:

176.9.161.91
[1.63333, 111.83333]
Sarawak
Malaysia
MY

ревизия с гитхаба позволяет чуть приблизиться к реальному геотаргетингу:

176.9.161.91
[59.91273, 10.74609]
Oslo County
Norway
NO

, и только php API дает правильный результат, причем во всех трех случаях использовалась одна и та же база данных Sypex Geo:

176.9.161.91
Координаты Lat 50.48 and Lon 12.37
Falkenstein
DE

Использовать, таким образом, gem 'sypex_geo' на продакшне не представляется возможным, просьба отнестись к представленному в блоге материалу сугубо как к учебному пособию, и не более. Впрочем, есть вариант юзать на rails при определении геотаргетинга REST API Sypex Geo.

For example, убираем из Gemfile - gem 'sypex_geo' - и делаем контроллер похожим на следующие строчки кода:

class WeatherController < ApplicationController
  def index
      
      ip = request.remote_ip
      response = HTTParty.get('http://api.sypexgeo.net/json/' + ip)
      r = response.parsed_response.with_indifferent_access
      
      # @lat = r[:city][:lat]
      # @lon = r[:city][:lon]
      
      @location = r[:city][:lat],r[:city][:lon]
      @region = r[:city][:name_en]
      @country_code = r[:country][:iso]
      @timezone = r[:country][:timezone]


     @cities = "lat=#{r[:city][:lat]}&lon=#{r[:city][:lon]}"
     @lookup = Weather.call(@cities)
     @temp = Weather.max_value(Weather.make_hash(@lookup, "temp"))
     @pressure = Weather.max_value(Weather.make_hash(@lookup, "pressure"))
     @humidity = Weather.min_value(Weather.make_hash(@lookup, "humidity"))
     @clouds = Weather.min_value(Weather.cloud_hash(@lookup))
    
  end
end
Последнее редактирование: 1 нед. 16 ч. назад от p.rishard. Причина: Добавлен рабочий пример использования REST API Sypex Geo

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.