我使用geocoder gem,它能够从http请求中获取IP地址。来自文档:
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 :(得分: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
答案 1 :(得分:0)
如果您只需要一个IP地址,那么您可以从请求标头中获取该IP地址。由于欺骗,它可能不完全准确,但是通过快速查看一些标题值,我发现REMOTE_ADDR包含我的。把它放在一个控制器中。如果其他人可以推荐使用其他或更好的值,请告诉我们。
request.headers['REMOTE_ADDR']
我实际上尝试检查HTTP_X_FORWARDED_FOR,但它并没有存在于标头中。也许webrick没有使用它。