机械化和辛纳特拉冲突

时间:2013-05-27 17:21:51

标签: ruby sinatra mechanize

我使用 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个宝石分别工作正常,但只有它们合并才会导致问题。任何人都可以指出问题可能是什么?

3 个答案:

答案 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的当前值