Sinatra 应用程序在加载期间执行,而不是在发出 运行 方法之后执行

Sinatra app executes during load instead of after run method issued

这是我正在构建的真实应用程序的精简示例。当我执行我的应用程序时,这就是我得到的结果。您会注意到它在开始之前说它是 运行ning。您还会注意到它在开始发出后从不说 运行ning。

bundle exec rackup
Using thin;
Sapp::App running.
Starting Sapp::App
== Sinatra (v1.4.7) has taken the stage on 4567 for development with backup from Thin
Thin web server (v1.7.0 codename Dunder Mifflin)
Maximum connections set to 1024
Listening on localhost:4567, CTRL+C to stop

我的config.ru是:

# http://www.rubydoc.info/gems/webmachine/Webmachine/Adapters/Rack
$started = false
require 'thin'
require 'sinatra'
set :server, (ENV['RACK_ENV'] == 'production' || ENV['RACK_ENV'] == 'staging' ? 'rack' : 'thin')
puts "Using #{settings.server};"
load 'webmachine/adapters/rack.rb'
load File.join(File.dirname(__FILE__), 'sapp.rb')
$started = true
puts 'Starting Sapp::App'
#Sapp::App.run!
Sinatra::Application.run!

我设置 $started 只是为了尝试解决这个问题,但没有帮助。我的应用程序在设置之前执行。我可以控制它,但是,这就是问题所在,它不会在 运行 发出后执行。

sapp.rb 是:

ENV['RACK_ENV'] ||= 'development'
Bundler.setup
$: << File.expand_path('../', __FILE__)
$: << File.expand_path('../lib', __FILE__)
require 'dotenv'
Dotenv.load(
    File.expand_path("../.env.#{ENV['RACK_ENV']}", __FILE__),
    File.expand_path("../.env", __FILE__))
module Sapp
  class App < Sinatra::Application
    puts 'Sapp::App has been started.' if $started
    puts 'Sapp::App running.'

  end
end

最后,如果不出意外的话,一旦说了"Starting Sapp::App",也应该说"Sapp::App has been started."和"Sapp::App running."

郑重声明,这两个选项的作用相同:

Sapp::App.run!
Sinatra::Application.run!

好的,我明白了。我将代码放在 class 中,但不是方法。像这样加载或要求 运行 打开代码。我需要将它包装在方法中,并执行这些方法,以完成我想做的事情。

我遵循的 Sinatra 示例并没有说明这一点,只是回避了这个话题。许多非常简单,没有什么区别,有些只是在 config.ru 中编码。我来自 Rails,虽然我从 Rails 知道这一点,但它并没有太大的区别,因为绝大多数代码已经存在于方法中。