当我尝试启动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工作正常。
答案 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