5

我使用Mechanize作为命令行实用程序编写了一个简单的网络爬虫。然后我决定用Sinatra创建网络应用程序,但是在尝试运行本地网络服务器时遇到了这个错误:

/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 颗宝石分别工作正常,但只有将它们组合起来才会导致问题。谁能指出问题可能是什么?

4

3 回答 3

3

很可能您正在使用诸如 get with mechanize 之类的压倒一切的方法。尝试将您的 Sinatra 应用程序包装到应用程序类中。这可能会解决问题。

require 'sinatra/base'

class MyApp < Sinatra::Base
  get '/' do
    # mechanize stuff
  end
end

在Sinatra 文档中了解有关该方法的更多信息。

于 2013-05-27T22:49:58.033 回答
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
于 2013-07-30T04:44:59.177 回答
0

正如 iltempo 和 user2632580 所提到的,失败的原因是 Sinatra 默认尝试的服务器列表,在 Mechanize gem 覆盖的 HTTP 上失败。

解决此问题的另一种方法是为 Sinatra 提供不同的服务器列表,以按照http://www.sinatrarb.com/configuration.html上的文档进行尝试(请参阅“内置设置”>“:服务器”) .

示例脚本:

require 'sinatra'
require 'mechanize'

set :server, %w[thin puma reel webrick]

get '/' do
   "Hello world!"
end

示例中的此列表基于Sinatra::Base::server减号的当前值HTTP

于 2015-04-06T16:02:24.480 回答