如何使用机架和地理编码器获取IP地址

时间:2016-08-14 19:42:19

标签: ruby sinatra rack rails-geocoder

我想通过地理编码器获取IP地址的位置。 docs说使用以下行:

result = request.location

但是这会产生一个NameError并且说“请求”是未定义的。所以我想我需要一个Rack :: Request对象:

result = Rack::Request.new(env)

但是那个toos给出了一个NameError - 这次说env未定义。

所以我在新脚本中检查了env,其中包含以下内容:

require "rack" 
def pp(hash)
 hash.map {|key,value| "#{key} => #{value}"}.sort.join("<br/>") 
end
Rack::Handler::WEBrick.run lambda {|env| [200,{},[pp(env)]]} , :Port=>3000

当我运行它并转到localhost:3000时,我看到了env哈希。默认情况下,未在Rack中设置env吗?

我无法理解这一点,我知道这是因为我错过了一些东西。

1 个答案:

答案 0 :(得分:2)

修复您的地理编码器设置

您从文档中了解的代码假定您将在rails控制器或Sinatra应用程序中托管代码片段。&#34;要让它与Sinatra一起工作是相当简单的。从项目目录中填充以下两个文件:

# Gemfile
source 'https://rubygems.org'

gem 'sinatra'
gem 'geocoder'

#######################

# main.rb
require 'sinatra'
require 'geocoder'

get '/' do
  <<-HTMLOUT
  <html>
  <body>
  <p><strong>Request Location</strong>: #{request.location.inspect}</p>
  </body>
  </html>
HTMLOUT
end

然后从您的终端运行bundle install并启动应用ruby main.rb -p 4567。转到http://localhost:4567进行检查。因为它是localhost,所以不会填充任何地理编码数据......但是这应该可以让你开始。

关于未定义的错误

您应该能够在ENV['RACK_ENV']内找到Rack的环境变量。尝试将此代码段添加到您的代码中:

env = ENV["RACK_ENV"] || "development"

Ruby简写默认分配

如果尚未设置配置,这种Ruby速记分配技术对于分配默认值很有用。例如:

# pretend FAKE_ENV is your ENV  
FAKE_ENV = {"DEFINED_KEY" => "defined_value"}
env = FAKE_ENV["DEFINED_KEY"] || "my_default"
# => "defined_value
env = FAKE_ENV["UNDEFINED_KEY"] || "my_default"
# => "my_default"