ruby – Sinatra不是以twitter gem开头的

前端之家收集整理的这篇文章主要介绍了ruby – Sinatra不是以twitter gem开头的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我尝试启动sinatra时,我遇到了以下错误

/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/base.rb:1488:in start_server’:HTTP的undefined methodrun’:模块(NoMethodError)

  1. require 'sinatra/base'
  2. require_relative "twt.rb"
  3.  
  4. class SinatraApp < Sinatra::Base
  5. set :static,true
  6. set :public_folder,File.dirname(__FILE__) + '/static'
  7.  
  8. get '/getuserinfo' do
  9. @user = twit.getuserinfo
  10. erb :userInfo
  11. end
  12. end
  13.  
  14. SinatraApp.run!

在“twt.rb”我需要推特(5.7.1)

  1. require 'twitter'
  2.  
  3. class Twit
  4. attr_accessor :client
  5.  
  6. def initialize(consumer_key,consumer_secret,access_token,access_token_secret)
  7. @client = Twitter::REST::Client.new do |config|
  8. config.consumer_key = consumer_key
  9. config.consumer_secret = consumer_secret
  10. config.access_token = access_token
  11. config.access_token_secret = access_token_secret
  12. end
  13. end
  14.  
  15. def getUserInfo
  16. return user = {
  17. "name"=> client.current_user.name,"id" => client.current_user.id
  18. }
  19. end
  20.  
  21. def showAllFriends
  22. client.friends.each { |item| puts item.name }
  23. end
  24.  
  25. def showFollowers
  26. client.followers.each { |item| puts item.screen_name }
  27. end
  28.  
  29. def showAllTweets
  30. client.user_timeline.each {|item| puts item.text}
  31. end
  32.  
  33. def showAllUserTweets(userScreenName)
  34. client.user_timeline(userScreenName).each {|item| puts item.text}
  35. end
  36.  
  37. def sendTweet(content)
  38. client.update(content)
  39. end
  40. 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宝石depends on the http gem,反过来defines a HTTP module.(命名顶级模块的东西像HTTP一样通用可能不是一个好主意).

所以在这种情况下发生的事情是Sinatra正在检查HTTP服务器是否可用,但是Rack正在从http gem返回HTTP模块,http gem不是服务器.不是Rack服务器,它没有run方法,所以当Sinatra尝试使用它时,你会得到错误start_server’:未定义的方法`run’用于HTTP:Module.

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

另一个解决方案是明确specify the server to use in your Sinatra app.例如,您可以安装Thin,然后使用:

  1. set :server,'thin'

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

  1. set :server,'webrick'

猜你在找的Ruby相关文章