我使用 Mechanize 作为命令行实用程序编写了一个简单的Web爬网程序。然后我决定使用 Sinatra 创建Web应用程序,但在尝试运行本地Web服务器时遇到了这个错误:
/home/nazar/.rvm/gems/ruby-2.0.0-p195/gems/sinatra-1.4.2/lib/sinatra/base.rb:1569:in `run!': undefined method `run' for HTTP:Module (NoMethodError)
from /home/nazar/.rvm/gems/ruby-2.0.0-p195/gems/sinatra-1.4.2/lib/sinatra/main.rb:25:in `block in <module:Sinatra>'
源代码很简单:
require 'sinatra'
require 'mechanize'
get '/' do
# mechanize stuff
end
我经历了一些调查,并设法发现2个宝石分别工作正常,但只有它们合并才会导致问题。任何人都可以指出问题可能是什么?
答案 0 :(得分:3)
最有可能的是,你可以采用机械化等方法。尝试将Sinatra应用程序包装到应用程序类中。这可能会解决问题。
require 'sinatra/base'
class MyApp < Sinatra::Base
get '/' do
# mechanize stuff
end
end
在Sinatra documentation中了解有关该方法的更多信息。
答案 1 :(得分:3)
我有同样的问题,并且能够通过安装和使用Thin作为我的本地网络服务器来解决它。
我挖掘了sinatra来源并看到它试图猜测运行时使用的服务器,按顺序,你可以通过irb看到:
1.9.3p194 :011 > require 'sinatra'
=> true
1.9.3p194 :012 > Sinatra::Base
=> Sinatra::Base
1.9.3p194 :014 > Sinatra::Base::server
=> ["thin", "puma", "HTTP", "webrick"]
通常Sinatra会回到webrick但是Mechanize有一个名为HTTP的模块,所以它试图将其用作服务器,当然这不起作用。
我在run.sh脚本中使用它来指定Thin:
rerun -- thin start --port=4567 -R config.ru
答案 2 :(得分:0)
如iltempo和user2632580所述,失败的原因是Sinatra默认尝试的服务器列表,在Mechanize gem覆盖的HTTP上失败。
另一种解决此问题的方法是为Sinatra提供不同的服务器列表,以便根据http://www.sinatrarb.com/configuration.html处的文档进行尝试(请参阅&#34;内置设置&#34;&gt;&#34; :服务器&#34)
示例脚本:
require 'sinatra'
require 'mechanize'
set :server, %w[thin puma reel webrick]
get '/' do
"Hello world!"
end
示例中的此列表基于Sinatra::Base::server
减去HTTP
的当前值