Геокодер, как тестировать локально, когда ip 127.0.0.1?
Я не могу заставить геокодер работать корректно, так как мой локальный IP-адрес - 127.0.0.1, поэтому он не может быть расположен там, где я прав.
В запросе .location.ip отображается "127.0.0.1"
Как я могу использовать другой ip-адрес (мое интернет-соединение ip), чтобы он мог перевести более релевантные данные?
Ответы
Ответ 1
Хороший чистый способ сделать это - использовать 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')
Ответ 2
Для этого я обычно использую 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
Ответ 3
Я реализовал это немного иначе, и это хорошо работает для моего случая.
В 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
Я просто жестко кодирую некоторые адреса, но вы можете делать все, что вам нужно.
Ответ 4
У меня был тот же вопрос. Вот как я реализовал геокодер.
#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
Ответ 5
Это обновленный ответ для геокодера 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
Ответ 6
вы также можете сделать это
request.safe_location