2012-04-28 47 views
1

我使用geocoder gem,它可以從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/ Freegeoip)有各種方法,你可以嘗試使用這些方法。 – 2012-04-28 03:28:27

+0

謝謝,但是不是很奇怪ip_address不是這些方法之一嗎?地址方法似乎是一個物理地址。 – Leahcim 2012-04-28 03:43:46

+0

'request.ip',至少這就是他們所說的http://www.rubygeocoder.com/ – 2012-04-28 03:48:05

回答

0

如果你所需要的只是一個IP地址,那麼你可以從請求頭獲得它。由於欺騙,它可能並不完全準確,但通過快速查看一些標題值,我發現REMOTE_ADDR包含我的內容。把它放在一個控制器裏。如果其他人可以推薦其他或更好的價值來使用,請告訴我們。

request.headers['REMOTE_ADDR'] 

我實際上試過檢查HTTP_X_FORWARDED_FOR,但它不存在於頭文件中。也許webrick不使用它。

+0

**注意**:並不那麼簡單!它更簡單! :)檢查我的答案! – jdoe 2012-04-28 05:07:15

3

獲取客戶端IP的使用request.ip。這是獲取IP的更正確方法,尤其是當您的用戶位於代理的後面時。所以,這是簡單的:

request.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