好吧所以这很奇怪(对我而言),我的主分支中的所有内容都运行良好,然后我创建了一个名为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
有没有人对我需要解决的问题有任何想法?任何人都可以从中获得经验吗?
由于
答案 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。