Sinatra并不是以twitter gem开头的

时间:2014-03-01 18:33:09

标签: ruby twitter sinatra

当我尝试启动sinatra时,我收到了以下错误

对于HTTP:Module(NoMethodError)

/ {/ 1} / {/ { >
start_server': undefined method

在“twt.rb”中我需要twitter(5.7.1)

require 'sinatra/base'
require_relative "twt.rb"

class SinatraApp < Sinatra::Base
    set :static, true
    set :public_folder, File.dirname(__FILE__) + '/static'

    get '/getuserinfo' do
        @user = twit.getuserinfo
        erb :userInfo
    end
end

SinatraApp.run!

如果我删除require_relative“twt.rb”行sinatra工作正常。

2 个答案:

答案 0 :(得分:13)

当您使用内置Web服务器运行Sinatra应用程序时(与SinatraApp.run!一样),Sinatra会尝试通过依次检查服务器列表来确定使用哪个服务器,以查看哪些服务器可用。实际列表depends on the version of Ruby you are using,但它始终检查的一个服务器是net-http-server,其名称为HTTP

Sinatra检查服务器可用性的方法是使用calls const_get尝试查找常量Rack::Handler::<server-name>的机架方法。但是,由于const_get的工作方式,如果该常量不可用,但是与server-name具有相同名称的顶级常量,那么无论它是什么类,都将返回该常量。 (这可以说是Rack中的一个错误。)

Twitter宝石depends on the http gem,反过来defines a HTTP module。 (将顶级模块命名为HTTP这样的通用名称可能不是一个好主意。)

所以在这种情况下发生的事情是Sinatra正在检查HTTP服务器是否可用,但Rack正在从HTTP gem返回http模块,其中不是服务器。不是Rack服务器,它没有run方法,因此当Sinatra尝试将其用作一个时,您会收到错误start_server': undefined method `run' for HTTP:Module

一种解决方法是不使用内置服务器,例如您使用config.ru文件发现并使用rackup启动应用的方式。

另一种解决方案是明确specify the server to use in your Sinatra app。例如,您可以安装Thin,然后使用:

set :server, 'thin'

事实上,只需安装Thin就足以在HTTP之前搜索Thin,但您可能更好地明确设置要使用的服务器。如果您因任何原因无法安装任何其他服务器,则可以使用Webrick:

set :server, 'webrick'

答案 1 :(得分:0)

我找到了解决方案。 我用config.ru启动sinatra,它现在有效。

rack config.ru