我想通过地理编码器获取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
吗?
我无法理解这一点,我知道这是因为我错过了一些东西。
答案 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速记分配技术对于分配默认值很有用。例如:
# 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"