如何使用 rack 和 geocoder 获取 ip 地址
how to get ip address using rack and geocoder
我想使用地理编码器获取 IP 地址的位置。 docs 表示使用以下行:
result = request.location
但这给出了一个 NameError 并且说 "request" 是未定义的。所以我想我需要一个 Rack::Request 对象:
result = Rack::Request.new(env)
但这也给出了 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 哈希。 env
在Rack中不是默认设置的吗?
我想不通,我知道这是因为我遗漏了什么。
修复您的地理编码器设置
您从文档中遵循的代码假定您将托管来自 "within a rails controller or Sinatra app." 的代码段。要使其与 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 查看。因为它是本地主机,none 的地理编码数据将被填充...但这应该让你开始。
关于未定义的错误
您应该能够在 ENV['RACK_ENV']
中找到 Rack 的环境变量。尝试将此代码段添加到您的代码中:
env = ENV["RACK_ENV"] || "development"
Rubyshorthand默认赋值
这种Ruby shorthand赋值技术对于在我们的配置尚未设置的情况下分配默认值很有用。例如:
# 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"
我想使用地理编码器获取 IP 地址的位置。 docs 表示使用以下行:
result = request.location
但这给出了一个 NameError 并且说 "request" 是未定义的。所以我想我需要一个 Rack::Request 对象:
result = Rack::Request.new(env)
但这也给出了 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 哈希。 env
在Rack中不是默认设置的吗?
我想不通,我知道这是因为我遗漏了什么。
修复您的地理编码器设置
您从文档中遵循的代码假定您将托管来自 "within a rails controller or Sinatra app." 的代码段。要使其与 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 查看。因为它是本地主机,none 的地理编码数据将被填充...但这应该让你开始。
关于未定义的错误
您应该能够在 ENV['RACK_ENV']
中找到 Rack 的环境变量。尝试将此代码段添加到您的代码中:
env = ENV["RACK_ENV"] || "development"
Rubyshorthand默认赋值
这种Ruby shorthand赋值技术对于在我们的配置尚未设置的情况下分配默认值很有用。例如:
# 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"