Sinatra的奇怪问题

时间:2013-06-17 12:25:33

标签: ruby sinatra

好吧所以这很奇怪(对我而言),我的主分支中的所有内容都运行良好,然后我创建了一个名为twitter的新分支来执行一些twitter feed实现。我已经完成了这个并且昨天在我的linux机器上工作..我今天在Windows环境中拉动了分支但是当我加载应用程序时我现在得到常规的Sinatra 404 Sinatra不知道这个小曲。

这是我的profile.rb文件

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

有没有人对我需要解决的问题有任何想法?任何人都可以从中获得经验吗?

由于

1 个答案:

答案 0 :(得分: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

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

请参阅Sinatra docs for more info about the difference between classic and modular style