【问题标题】:Sinatra and BundlerSinatra 和捆绑器
【发布时间】:2011-03-24 11:18:40
【问题描述】:

我正在尝试设置 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 并得到“捆绑完成”,所以现在我需要做的只是 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

怎么了? :(

【问题讨论】:

  • 你能给我们看看你的 MyApp.rb 吗?
  • 嘿,我已将 MyApp.rb 缩减为触发相同错误的内容:/

标签: ruby rubygems sinatra rack bundler


【解决方案1】:

如果你告诉 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/ 上搜索名为“模块化应用程序”的段落)

【讨论】:

  • 谢谢,现在似乎工作正常。我以前从未遇到过 Sinatra::Base。请注意,我将 Config.ru 更新为“MyApp.run!:host => 'localhost', :port => 9090”,但我没有意识到我还必须在其中绑定一个端口才能启动它。
  • 使用 MyApp.run! config.ru 里面可能不是你想要的。 MyApp.运行!启动一个为您的应用程序提供服务的新服务器进程(因此您需要告诉它端口)。在 config.ru 中,您想告诉已经在运行的网络服务器(刚刚启动并正在解析 config.ru 的服务器,例如独角兽)如何将 http 请求定向到您的应用程序(通过在 config.ru 中告诉它run MyApp) . MyApp.运行!启动一个完全不同的独立服务器(afaik)不使用 config.ru,它用于独立使用(例如在开发期间),不应该在 config.ru 中使用。
  • 谢谢,是的 MyApp.Run!完全不是我想要的。
【解决方案2】:

此外,您的 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

【讨论】:

  • 那里的 URLMap 只是增加了复杂性,run Sinatra::Application 将给出相同的结果。
【解决方案3】:

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

run Sinatra::Application

在config.ru 文件中代替

run MyApp

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

见the docs for more info。

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 2018-09-26
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多