模块化Sinatra应用程序中的Ruby URI模块奇怪

时间:2013-08-30 13:50:55

标签: ruby sinatra uri

我在模块化的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?

3 个答案:

答案 0 :(得分:3)

课程Sinatra::Basehttps://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'在那里做了伎俩。