ローカル IP アドレスが 127.0.0.1 であるため、ジオコーダーを正しく機能させることができず、正しい場所を見つけることができません。
request.location.ip は「127.0.0.1」を示しています
別の IP アドレス (インターネット接続の IP) を使用して、より関連性の高いデータを取得するにはどうすればよいですか?
ローカル IP アドレスが 127.0.0.1 であるため、ジオコーダーを正しく機能させることができず、正しい場所を見つけることができません。
request.location.ip は「127.0.0.1」を示しています
別の IP アドレス (インターネット接続の IP) を使用して、より関連性の高いデータを取得するにはどうすればよいですか?
それを行う良いクリーンな方法は、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')
このために、私は通常、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
私はこれを少し異なって実装しましたが、これは私の場合にはうまくいきます。
にはapplication_controller.rb
、request.remote_ip の結果を直接渡す Geocoder 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
私はいくつかのアドレスをハードコーディングしただけですが、ここでは好きなようにできます。
同じ質問がありました。これが私がジオコーダーで実装した方法です。
#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)
( geo_magic gem の hostip.info を含むコード部分、およびこの質問に対する他の回答に基づいています。)
今、あなたは次のようなことができますresponse.first.state
This is an updated answer for geocoder 1.2.9 to provide a hardcoded IP for development and test environments. Just place this at the bottom of your 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
これを行うこともできます
request.safe_location