当我尝试启动 sinatra 时,出现以下错误
/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/base.rb:1488:in start_server': undefined method
run' for HTTP:模块(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”中我需要 Twitter (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 会依次检查服务器列表以查看可用的服务器,从而尝试确定要使用的服务器。实际列表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 gem depends on the http
gem ,然后依次defines a HTTP
module . (用像 HTTP
这样通用的东西命名顶级模块可以说不是一个好主意)。
所以在这种情况下发生的是 Sinatra 正在检查是否 HTTP
服务器可用,但 Rack 返回 HTTP
来自 http
的模块gem,它不是服务器。不是机架服务器,它没有 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'
关于ruby - Sinatra 不以 twitter gem 开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22118533/