Sinatra并不是以twitter gem开头的

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

/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/base.rb:1488:in start_server': undefined method用于HTTP的start_server': undefined method运行:模块(NoMethodError)

 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! 

在“twt.rb”我需要推特(5.7.1)

 require 'twitter' class Twit attr_accessor :client def initialize(consumer_key,consumer_secret,access_token,access_token_secret) @client = Twitter::REST::Client.new do |config| config.consumer_key = consumer_key config.consumer_secret = consumer_secret config.access_token = access_token config.access_token_secret = access_token_secret end end def getUserInfo return user = { "name"=> client.current_user.name, "id" => client.current_user.id } end def showAllFriends client.friends.each { |item| puts item.name } end def showFollowers client.followers.each { |item| puts item.screen_name } end def showAllTweets client.user_timeline.each {|item| puts item.text} end def showAllUserTweets(userScreenName) client.user_timeline(userScreenName).each {|item| puts item.text} end def sendTweet(content) client.update(content) end end 

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

当您使用内置Web服务器运行Sinatra应用程序时(就像使用SinatraApp.run! ),Sinatra尝试通过依次检查服务器列表来确定使用哪个服务器以查看哪些服务器可用。 实际列表取决于您使用的Ruby版本 ,但它始终检查的一个服务器是net-http-server ,它简称为HTTP

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

Twitter gem 取决于http gem ,而后者又定义了一个HTTP模块 。 (用一般通用的HTTP命名顶级模块可能不是一个好主意)。

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

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

另一种解决方案是明确指定要在Sinatra应用程序中使用的服务器 。 例如,您可以安装Thin,然后使用:

 set :server, 'thin' 

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

 set :server, 'webrick' 

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

 rack config.ru