2

ok so this is very strange (well is to me), everything in my master branch works fine, I then created a new branch called twitter to conduct some twitter feed implementation. I have done this and was working yesterday on my linux machine.. I have pulled the branch today in a windows environment but when i load the app i now get the regular Sinatra 404 Sinatra doesn’t know this ditty.

This is my profile.rb file

require 'bundler/setup'
Bundler.require(:default)
require 'rubygems'
require 'sinatra'
require './config/config.rb' if File.exists?('./config/config.rb')
require 'sinatra/jsonp'
require 'twitter'
require 'sinatra/static_assets'


class Profile < Sinatra::Base

helpers Sinatra::Jsonp
enable :json_pretty
register Sinatra::StaticAssets

@@twitter_client = Twitter::Client.new(
:consumer_key       => ENV["CONSUMER_KEY"],
:consumer_secret    => ENV["CONSUMER_SECRET"],
:oauth_token        => ENV["OAUTH_TOKEN"],
:oauth_token_secret => ENV["OAUTH_SECRET"],
)


get '/' do
 erb :index
end


get '/feed' do
 jsonp @@twitter_client.user_timeline('richl14').map(&:attrs)
end


end

Config.ru

  require './profile'

  run Profile

Does anyone have any ideas of what i need to be looking at to solve this? Can anyone speak from experience with this?

Thanks

4

1 回答 1

5

当您使用您使用的经典 Sinatra 样式时require 'sinatra',然后将路由添加到顶层。这些路由被添加到Sinatra::Application. 当您直接运行此文件时,例如使用ruby my_app.rb,Sinatra 运行一个内置的 Web 服务器,它将为Sinatra::Application应用程序提供服务。

当您使用模块化样式时,您使用require 'sinatra/base',然后将路由添加到您的Sinatra::Base子类。在这种情况下,直接执行文件不会启动内置服务器。

在您的情况下,您使用的是模块化样式,但使用了require 'sinatra'. 您创建了Profile应用程序,但是当您直接运行文件时,Sinatra 会启动内置服务器并为Sinatra::Application应用程序提供服务。由于您没有为此添加任何路由(它们都已添加到Profile),因此它运行但所有请求都返回 404。

让您的应用启动的一种方法是使用rackup. 这将启动Profile您在config.ru. (显式启动您的网络服务器也可以,例如使用thin start)。

另一种可能性是在您的Profile课程末尾添加这样的一行:

run! if app_file == $0

如果文件与正在执行的 Ruby 文件相同,这将告诉 Sinatra 启动运行应用程序的内置服务器Profile,其方式类似于启动经典样式应用程序的方式。如果您使用这种方法,您应该更改require 'sinatra'为,require 'sinatra/base'否则您将启动两台服务器,一个接一个(实际上您可能应该进行更改)。

有关经典风格和模块化风格之间区别的更多信息,请参阅Sinatra 文档。

于 2013-06-17T18:21:29.077 回答