13

ローカル IP アドレスが 127.0.0.1 であるため、ジオコーダーを正しく機能させることができず、正しい場所を見つけることができません。

request.location.ip は「127.0.0.1」を示しています

別の IP アドレス (インターネット接続の IP) を使用して、より関連性の高いデータを取得するにはどうすればよいですか?

4

6 に答える 6

21

それを行う良いクリーンな方法は、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')
于 2012-01-18T20:51:28.783 に答える
5

このために、私は通常、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
于 2011-05-24T19:37:45.287 に答える
4

私はこれを少し異なって実装しましたが、これは私の場合にはうまくいきます。

には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

私はいくつかのアドレスをハードコーディングしただけですが、ここでは好きなようにできます。

于 2013-06-11T00:46:01.833 に答える
1

同じ質問がありました。これが私がジオコーダーで実装した方法です。

#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

于 2011-06-21T22:16:53.190 に答える
1

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
于 2015-08-24T20:16:31.813 に答える
-1

これを行うこともできます

request.safe_location
于 2016-03-10T05:12:59.907 に答える