2010-08-02 72 views
1

我試圖讓Bundler安裝,所以我可以將我的Sinatra應用程序部署到所有正確的寶石服務器。Sinatra和Bundler

我已經建立了我的Gemfile

source :gemcutter 
gem 'sinatra', '1.0' 
gem "nokogiri", "1.4.2" 
gem "rack", "1.1.0" 
gem "dm-core", "1.0.0" 
gem "dm-migrations", "1.0.0" 
gem "dm-sqlite-adapter", "1.0.0" 
gem "pony", "1.0" 

接下來,我創建了一個Config.ru

require 'rubygems' 
require 'bundler' 
Bundler.setup 

require 'sinatra' 
require 'dm-core' 
require 'dm-migrations' 
require 'dm-sqlite-adapter' 
require 'open-uri' 
require 'nokogiri' 
require 'csv' 
require 'pony' 
require 'parsedate' 
require 'digest/md5' 

require 'MyApp' 
run MyApp 

到目前爲止好,所以接下來我跑bundle install並得到了「捆綁完成」所以現在所有我需要做的僅僅是Rackup

然後我得到:

config.ru:18: undefined local variable or method `MyApp' for #<Rack::Builder:0x1227350 @ins=[]> (NameError) 
from /usr/local/lib/ruby/gems/1.8/gems/rack-1.1.0/lib/rack/builder.rb:46:in `instance_eval' 
from /usr/local/lib/ruby/gems/1.8/gems/rack-1.1.0/lib/rack/builder.rb:46:in `initialize' 
from config.ru:1:in `new' 
from config.ru:1 

下面是一個簡單MyApp.rb將觸發同樣的錯誤

get '/' do 
    erb :index 
end 

什麼錯? :(

+0

你能告訴我們你的MyApp.rb嗎? – 2010-08-02 23:45:01

+0

嘿,我已經減少了MyApp.rb觸發相同的錯誤:/ – Tom 2010-08-03 18:28:44

回答

9

如果您將Rack指定爲run MyApp,則需要首先定義MyApp類(您應該在MyApp.rb中執行此操作)。從Sinatra :: Base派生類,使其成爲Sinatra-Rack-可以從config.ru運行應用程序:

require 'sinatra/base' 
class MyApp < Sinatra::Base 
    get '/' do 
    erb :index 
    end 
end 

又見Sinatra的約模塊化西納特拉應用程序自述(搜索名爲「模塊化應用程序」上http://github.com/sinatra/sinatra/段)

+0

謝謝,現在似乎工作正常。我以前從未遇到Sinatra :: Base。 只是爲了說明我更新了我的Config.ru以讀取「MyApp.run!:host =>'localhost',:port => 9090」沒有意識到我還必須綁定那裏的端口才能啓動它向上。 – Tom 2010-08-03 21:23:36

+0

使用MyApp.run!裏面config.ru可能不是,你想要什麼。 MyApp.run!開始爲您的應用程序提供服務的新服務器進程(因此您需要將其告知端口)。在config.ru裏面,你想告訴已經運行的web服務器(剛啓動並解析config.ru,例如獨角獸)如何將http請求指向你的應用(通過告訴它在config.ru中運行MyApp) )。 MyApp.run!啓動一個完全不同的獨立服務器(afaik)不使用config.ru,它意味着獨立使用(例如在開發過程中),不應該在config.ru內部使用。 – Zargony 2010-08-04 11:28:43

+0

謝謝,yep MyApp.Run!完全不是我想要的。 – Tom 2010-08-13 06:07:49

0

另外,你可以有你的my_app應用。 rb如下:

require 'rubygems' 
require 'bundler' 
Bundler.setup 

require 'sinatra' 
require 'dm-core' 
require 'dm-migrations' 
require 'dm-sqlite-adapter' 
require 'open-uri' 
require 'nokogiri' 
require 'csv' 
require 'pony' 
require 'parsedate' 
require 'digest/md5' 

而且你config.ru這樣的:

require './my_app' 
run Rack::URLMap.new '/' => Sinatra::Application 

希望這有助於。

問候

ED

+0

這裏的URLMap只是增加了複雜性,'run Sinatra :: Application'會給出相同的結果。 – 2013-08-06 21:04:31

0

作爲一種替代方法來創建一個模塊化的應用程序(包裹在延長Sinatra::Base類的西納特拉的方法),你可以使用:

run Sinatra::Application 

config.ru文件代替

run MyApp 

這m如果你想保持簡單的Sinatra代碼,那麼更好的選擇。

請參閱the docs for more info