/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/base.rb:1488:in start_server’:HTTP的undefined methodrun’:模块(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工作正常.
解决方法
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模块,http gem不是服务器.不是Rack服务器,它没有run方法,所以当Sinatra尝试使用它时,你会得到错误start_server’:未定义的方法`run’用于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'