2014-03-01 44 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