2014-03-01 45 views
5

开始当我尝试启动西纳特拉,我得到以下错误西纳特拉没有与Twitter宝石

/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/ base.rb:1488:在start_server': undefined method为HTTP运行”:模块中的 “twt.rb”(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! 

我需要的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“line sinatra工作正常。

回答

0

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

rack config.ru 
+0

仍然无法使用 – Mia

13

当您运行使用内置的Web服务器(如您SinatraApp.run!做)一西纳特拉的应用程序,西纳特拉尝试确定通过检查进而服务器的列表,看看哪些是可以使用的服务器。实际的清单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一样通用可能不是一个好主意)。

那么在这种情况下发生的是西纳特拉的检查,看是否HTTP服务器可用,但架从http宝石,这不是服务器返回HTTP模块。不是机架式服务器它没有一个run方法,所以当西纳特拉尝试使用它作为一个你的错误start_server': undefined method `run' for HTTP:Module

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

另一种解决方案是明确specify the server to use in your Sinatra app。例如,你可以安装薄,然后用:薄中搜索之前HTTP

set :server, 'thin' 

其实只要安装薄就足够了,但你可能会更好明确设置服务器使用。如果您因任何原因无法安装任何其他服务器,则可以使用Webrick代替:

set :server, 'webrick' 
+0

宾果。我也与'休息客户'宝石发生冲突。 – Tim

+0

谢谢。按照建议,我专门将服务器设置为webrick,现在正在为我工​​作。当我通过'bundle exec'开始运行Sinatra而不是直接运行Ruby时,我的问题就开始了。 – metaforge