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 知道这一点,但它并没有太大的区别,因为绝大多数代码已经存在于方法中。
这是我正在构建的真实应用程序的精简示例。当我执行我的应用程序时,这就是我得到的结果。您会注意到它在开始之前说它是 运行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 知道这一点,但它并没有太大的区别,因为绝大多数代码已经存在于方法中。