Sinatra并不是以twitter gem开头的

erk*_*mir 5 ruby twitter sinatra

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

/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/base.rb:1488:in'for start_server': undefined methodHTTP:Module(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!
Run Code Online (Sandbox Code Playgroud)

在"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
Run Code Online (Sandbox Code Playgroud)

如果我删除require_relative"twt.rb"行sinatra工作正常.

mat*_*att 13

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

Sinatra检查服务器可用性的方法是使用调用const_get try 方法查找常量的rack方法Rack::Handler::<server-name>.但是,由于该方法const_get有效,如果该常量不可用,但是具有与其名称相同的顶级常量server-name,那么无论它是什么类,都将返回该常量.(这可以说是Rack中的一个错误).

Twitter宝石取决于http宝石,而这反过来又定义了一个HTTP模块.(用一般的东西命名顶级模块HTTP可能不是一个好主意).

那么在这种情况下发生的事情是Sinatra正在检查HTTP服务器是否可用,但是Rack正在HTTPhttpgem 返回模块,而gem 不是服务器.不是Rack服务器,它没有run方法,因此当Sinatra尝试将其用作一个时,您会收到错误start_server': undefined method `run' for HTTP:Module.

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

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

set :server, 'thin'
Run Code Online (Sandbox Code Playgroud)

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

set :server, 'webrick'
Run Code Online (Sandbox Code Playgroud)


erk*_*mir 0

我找到了解决方案。我用 config.ru 启动 sinatra 现在它可以工作了。

rack config.ru
Run Code Online (Sandbox Code Playgroud)