【问题标题】:Sinatra does not start with twitter gemSinatra 不是从 twitter gem 开始的
【发布时间】:2014-04-02 20:02:06
【问题描述】:

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

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

在“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 工作正常。

【问题讨论】:

    标签: ruby twitter sinatra


    【解决方案1】:

    当您使用内置 Web 服务器运行 Sinatra 应用程序时(就像您使用 SinatraApp.run! 所做的那样),Sinatra 会尝试通过依次检查服务器列表来确定要使用的服务器以查看哪些服务器可用。实际列表depends on the version of Ruby you are using,但它始终检查的一台服务器是net-http-server,简称为HTTP。

    Sinatra 检查服务器可用性的方法是使用机架方法calls const_get 尝试查找常量Rack::Handler::&lt;server-name&gt;。但是,由于const_get 的工作方式,如果该常量不可用,但与server-name 同名的顶级常量存在,那么无论它是什么类,都会返回该常量。 (这可以说是 Rack 中的一个错误)。

    Twitter gem depends on the http gem,然后是 defines a HTTP module。 (用像HTTP 这样通用的东西命名一个顶级模块可能不是一个好主意)。

    所以在这种情况下发生的事情是 Sinatra 正在检查 HTTP 服务器是否可用,但 Rack 正在从 http gem 返回 HTTP 模块,不是 em> 服务器。它不是 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 就足够了,因为 Thin 是在 HTTP 之前搜索的,但您最好明确设置要使用的服务器。如果您因任何原因无法安装任何其他服务器,则可以改用 Webrick:

    set :server, 'webrick'
    

    【讨论】:

    • 宾果游戏。我还与“rest-client”gem 发生了冲突。
    • 谢谢。我按照建议将服务器专门设置为 webrick,现在对我有用。当我开始通过“bundle exec”而不是直接使用 Ruby 运行 Sinatra 时,我的问题就开始了。
    【解决方案2】:

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

    rack config.ru
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多