/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'