ruby - Sinatra 不以 twitter gem 开头

标签 ruby twitter sinatra

当我尝试启动 sinatra 时,出现以下错误

/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/base.rb:1488:in start_server': undefined methodrun' 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/

相关文章:

ruby - Erb 与 ruby 中的 Sinatra

Sinatra 中的 css.erb 文件

ruby-on-rails - 为什么这不拒绝我的记录

ruby-on-rails - Rails 嵌套 with_option :if used in validation

iOS (iPhone/iPad) SDK - 将 JSON 解析器与 Twitter 的 user_timeline 结合使用

iphone - accountTypeWithAccountTypeIdentifier 未完成

从 Sinatra::Base 子类化的 Ruby 类具有私有(private)方法,但它们在 irb 控制台中消失

ruby - 如何创建一个返回第 n 个素数的方法?

ruby - 中间人服务器在 Windows 0.0.0.0 :4567 上不工作

css - 设计/定制 Twitter 小部件?