0

我在模块化 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&b=2”。

那么,意味着 URI 出现问题的模块化格式出了什么问题?

4

3 回答 3

3

该类在https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb的第 856 行Sinatra::Base重新定义,这就是您的参考被评估为该值的原因。URIURI

如果你想避免这个问题,你可以改变你对::URI.

于 2013-08-30T14:21:09.693 回答
0

从 Sinatra 1.4.4 开始,不再覆盖URI 模块。

于 2014-01-23T14:04:45.353 回答
-2

我试图在irb. 这听起来可能很愚蠢,但require 'uri'确实成功了。

于 2013-08-30T14:19:06.680 回答