Геокодер, как проверить локально, когда ip равен 127.0.0.1? - PullRequest
13 голосов
/ 24 мая 2011

Я не могу заставить геокодер работать правильно, поскольку мой локальный IP-адрес 127.0.0.1, поэтому он не может быть расположен там, где я нахожусь правильно.

В request.location.ip отображается "127.0.0.1"

Как я могу использовать другой ip-адрес (ip моего интернет-соединения), чтобы получить более релевантные данные?

Ответы [ 6 ]

21 голосов
/ 19 января 2012

Хороший способ сделать это - использовать MiddleWare. Добавьте этот класс в каталог lib:

# lib/spoof_ip.rb

class SpoofIp
  def initialize(app, ip)
    @app = app
    @ip = ip
  end

  def call(env)
    env['HTTP_X_FORWARDED_FOR'] = nil
    env['REMOTE_ADDR'] = env['action_dispatch.remote_ip'] = @ip
    @status, @headers, @response = @app.call(env)
    [@status, @headers, @response]
  end
end

Затем найдите IP-адрес, который вы хотите использовать в своей среде разработки, и добавьте его в файл development.rb:

config.middleware.use('SpoofIp', '64.71.24.19')
5 голосов
/ 24 мая 2011

Для этого я обычно использую params[:ip] или что-то в разработке. Это позволяет мне проверять другие ip-адреса на функциональность и делать вид, что я где-то в мире.

Например

class ApplicationController < ActionController::Base
  def request_ip
    if Rails.env.development? && params[:ip]
      params[:ip]
    else
      request.remote_ip
    end 
  end
end
4 голосов
/ 11 июня 2013

Я реализовал это немного по-другому, и это хорошо работает для моего случая.

В application_controller.rb у меня есть метод поиска, который вызывает поиск IP Geocoder, напрямую передавая результаты request.remote_ip.

def lookup_ip_location
  if Rails.env.development?
    Geocoder.search(request.remote_ip).first
  else
    request.location
  end
end

Затем в config/environments/development.rb я пропатчил вызов remote_ip:

class ActionDispatch::Request
  def remote_ip
    "71.212.123.5" # ipd home (Denver,CO or Renton,WA)                                                                                                                                                                                                                                                                        
    # "208.87.35.103" # websiteuk.com -- Nassau, Bahamas                                                                                                                                                                                                                                                                      
    # "50.78.167.161" # HOL Seattle, WA                                                                                                                                                                                                                                                                                       
  end
end

Я просто жестко закодировал некоторые адреса, но вы могли бы делать здесь все, что захотите.

1 голос
/ 24 августа 2015

Это обновленный ответ для геокодера 1.2.9, предоставляющий жестко заданный IP для сред разработки и тестирования.Просто поместите это в нижней части вашего config/initilizers/geocoder.rb:

if %w(development test).include? Rails.env
  module Geocoder
    module Request
      def geocoder_spoofable_ip_with_localhost_override
        ip_candidate = geocoder_spoofable_ip_without_localhost_override
        if ip_candidate == '127.0.0.1'
          '1.2.3.4'
        else
          ip_candidate
        end
      end
      alias_method_chain :geocoder_spoofable_ip, :localhost_override
    end
  end
end
1 голос
/ 22 июня 2011

У меня был тот же вопрос. Вот как я реализовал геокодер.

#gemfile
gem 'httparty', :require => 'httparty', :group => :development 

#application_controller
def request_ip
  if Rails.env.development? 
     response = HTTParty.get('http://api.hostip.info/get_html.php')
     ip = response.split("\n")
     ip.last.gsub /IP:\s+/, ''      
   else
     request.remote_ip
   end 
end

#controller
ip = request_ip
response = Geocoder.search(ip)

(часть кода с hostip.info из geo_magic gem и другой ответ на этот вопрос.)

теперь вы можете сделать что-то вроде response.first.state

0 голосов
/ 10 марта 2016

Вы также можете сделать это

request.safe_location
...