Геокодер Ruby на Heroku дает частный IP-адрес

Ruby Geocoder (http://rubygeocoder.com/) отлично подходит для получения широты и долготы известного адреса. Теперь я пытаюсь использовать его для поиска кода страны по IP-адресу, чтобы новому пользователю не приходилось выбирать свою страну.

if @person.country.blank?
    ip_loc = Geocoder.search(my_ip_address)
    if ip_loc.present?
       @person.country = ip_loc[0].data['country_code']
    end
end

Чтобы получить их IP-адрес для передачи геокодеру, я использую сокет:

 def my_ip_address
    require 'socket'
    list=Socket.ip_address_list
    ip = list.detect{|intf| intf.ipv4_private?}
    ip.ip_address if ip
 end

Поскольку поиск по IP не будет работать для машины разработки (IP-адрес всегда является частным, внутренним номером), я пытаюсь проверить это на Heroku.

Однако, когда это работает на Heroku, я все еще получаю частный IP-адрес 172.19.75.142, который невозможно найти с помощью Geocoder.

Может ли кто-нибудь направить меня в продуктивном направлении для получения страны по IP, которая будет работать на Heroku?


person vbsql7    schedule 28.02.2015    source источник
comment
Просто для ясности... вам нужен IP-адрес (а вместе с ним и страна) сервера, на котором запущено приложение? Не пользователь, посещающий сайт?   -  person Philip Hallstrom    schedule 28.02.2015
comment
Мне нужен IP-адрес пользователя, который обращается к серверу. Я пытаюсь определить их страну.   -  person vbsql7    schedule 28.02.2015
comment
Затем, как упоминает Джоэл Брюэр ниже, вам нужен request.remote_ip. Обратите внимание, что если вы разрабатываете локально, это все равно будет внутренний IP-адрес, поэтому у вас должен быть запасной вариант.   -  person Philip Hallstrom    schedule 28.02.2015


Ответы (1)


Вы можете получить IP-адрес пользователя/клиента с помощью request.remote_ip. Затем вы сможете передать это значение в Geocoder.

Обратите внимание, что request будет доступно только в ваших контроллерах.

person Joel Brewer    schedule 28.02.2015
comment
Для локальной разработки вы можете добавить эту условную проверку, чтобы пропустить поиск. Если это правда, не беспокойтесь, так как это частный IP-адрес. ['127.0.0.0/8', '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', '192.168.10.0/8'].none?{|block| IPAddr.new(block) === request.remote_ip} - person Philip Hallstrom; 28.02.2015
comment
Спасибо обоим за полезную информацию! - person vbsql7; 28.02.2015
comment
@PhilipHallstrom Мне потребовалось немного времени, чтобы понять, что то, что вы дали, предназначено для оператора if. В блоке else мы должны использовать request.remote_ip - person camdixon; 08.03.2015