1

我正在尝试设置 Bundler,以便可以将我的 Sinatra 应用程序部署到具有所有正确 gem 的服务器。

我已经创建了我的 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并获得了“Bundle Complete”,所以现在我需要做的就是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

怎么了?:(

4

3 回答 3

9

如果你告诉 Rack run MyApp,你需要先定义 MyApp 类(你应该在 MyApp.rb 中做)。从 Sinatra::Base 派生您的类,使其成为可以从 config.ru 运行的 Sinatra-Rack-App:

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

另请参阅 Sinatra 关于模块化 Sinatra 应用程序的自述文件(在http://github.com/sinatra/sinatra/上搜索名为“模块化应用程序”的段落)

于 2010-08-03T21:05:52.033 回答
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

于 2011-09-19T17:09:24.970 回答
0

作为创建模块化应用程序(将 Sinatra 方法包装在扩展类中Sinatra::Base)的替代方法,您可以使用:

run Sinatra::Application

config.ru文件中代替

run MyApp

如果您想保留简单的 Sinatra 代码,这可能是一个更好的选择。

有关更多信息,请参阅文档

于 2011-09-23T02:38:43.110 回答