Ruby:如何将对象更改为可读的东西

时间:2012-04-28 03:24:21

标签: ruby-on-rails ruby rails-geocoder

我使用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 %>

但它并没有改变任何事情。

有什么想法吗?

2 个答案:

答案 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没有使用它。