我在模块化的Sinatra应用程序中使用Ruby URI模块的encode_www_form
方法时遇到问题。出于某种原因,URI
被解释为URI::Parser
子类,因此方法调用可以理解为失败。
我已将此缩减为最小的测试用例。 Gemfile
:
source 'https://rubygems.org'
ruby '1.9.3'
gem 'sinatra'
app.rb
:
require 'sinatra/base'
class Frontend < Sinatra::Base
get '/test/' do
URI.encode_www_form(:a => 1, :b => 2)
end
run! if app_file == $0
end
如果我然后运行ruby app.rb
并访问/test/
,我会:
NoMethodError - undefined method `encode_www_form' for #<URI::Parser:0x007fa9221ca868>:
app.rb:6:in `block in <class:Frontend>'
如果我将其转换为经典风格的Sinatra应用,那么app.rb
就像这样:
require 'sinatra'
get '/test/' do
URI.encode_www_form(:a => 1, :b => 2)
end
然后拨打ruby app.rb
并访问/test/
,页面会根据需要显示“a = 1&amp; b = 2”。
那么模块化格式出现了什么问题,这意味着什么是URI?
答案 0 :(得分:3)
课程Sinatra::Base
在https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb的第856行重新定义URI
,这就是为什么您的URI
参考被评估为该值。
如果您想避免此问题,可以将引用更改为::URI
。
答案 1 :(得分:0)
从Sinatra 1.4.4开始,URI模块为no longer overwritten。
答案 2 :(得分:-2)
我试图在irb
中重现这一点。这可能听起来很愚蠢,但require 'uri'
在那里做了伎俩。