2012-04-28 7 views
1

httpリクエストからIPアドレスを取得するジオコーダ宝石を使用しています。ドキュメントから:Ruby:オブジェクトを読み取り可能なものに変更する方法

Geocoder adds a +location+ method to the standard <tt>Rack::Request</tt> object so you can easily look up the location of any HTTP request by IP address. For example, in a Rails controller or a Sinatra app: 

# returns Geocoder::Result object 
    result = request.location 

私は私のコントローラで

@result = request.location 

を配置し、私の見解で

<%= @result %> 

しかし、私はこれを得ました。

#<Geocoder::Result::Freegeoip:0x00000102dc7758> 

私はその後

<%= @result.to_s %> 

を試してみましたが、それは何も変更しませんでした。

アイデア?

+0

[ 'request.location'の戻り値](http://rubydoc.info/gems/geocoder/Geocoder/Result/:

request.ip 

ここではそのソースですFreegeoip)にはさまざまな方法がありますが、それらを使って試すことができます。 –

+0

ありがとうございますが、ip_addressがそれらのメソッドの1つではないというのは奇妙なことではありませんか?アドレスメソッドは物理アドレスのようです。 – Leahcim

+0

'request.ip'、少なくともそれは彼らが言うことですhttp://www.rubygeocoder.com/ –

答えて

0

IPアドレスが必要な場合は、リクエストヘッダーから取得できます。なりすましによって完全に正確ではないかもしれませんが、ヘッダー値の一部を見てみると、REMOTE_ADDRに私のものが含まれていることがわかりました。これをコントローラーに入れてください。他の誰かが他のまたはより良い値を使用することを推奨できる場合は、私たちに知らせてください。

request.headers['REMOTE_ADDR'] 

実際にHTTP_X_FORWARDED_FORのチェックを試みましたが、ヘッダーには存在しませんでした。多分私たちはそれを使わないでしょう。

+0

**注**:それは簡単ではありません!さらに簡単です! :)私の答えをチェック! – jdoe

3

クライアントのIPを取得するには、request.ipを使用します。これは、特にあなたのユーザーがプロキシの背後にいるときに、のIPを取得するより正しい方法です。だから、それはのように簡単です:

# File lib/rack/request.rb, line 256 
def ip 
    if addr = @env['HTTP_X_FORWARDED_FOR'] 
    (addr.split(',').grep(/\d\./).first || @env['REMOTE_ADDR']).to_s.strip 
    else 
    @env['REMOTE_ADDR'] 
    end 
end 
関連する問題