【问题标题】:Mechanize & Sinatra conflict机械化与 Sinatra 冲突
【发布时间】:2013-05-27 17:21:51
【问题描述】:

我编写了一个简单的网络爬虫,使用 Mechanize 作为命令行实用程序。然后我决定用 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 颗宝石分别工作正常,但只有将它们组合起来才会导致问题。谁能指出可能是什么问题?

【问题讨论】:

  • 你能发布更多你的代码吗?以及整个错误信息?我设置了我的源代码以匹配您的源代码,并且没有收到任何错误。
  • 我认为问题与代码无关。至少我试着只用“hello world”的东西来运行它

标签: ruby sinatra mechanize


【解决方案1】:

您很可能正在覆盖诸如 get 和 mechanize 之类的方法。尝试将您的 Sinatra 应用程序包装到一个应用程序类中。这可能会解决问题。

require 'sinatra/base'

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

Sinatra documentation 中了解有关该方法的更多信息。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并且能够通过安装和使用 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
    

    【讨论】:

      【解决方案3】:

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

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

      示例脚本:

      require 'sinatra'
      require 'mechanize'
      
      set :server, %w[thin puma reel webrick]
      
      get '/' do
         "Hello world!"
      end
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 2018-04-21
        • 2011-08-13
        相关资源
        最近更新 更多