【问题标题】:Sinatra app executes during load instead of after run method issuedSinatra 应用程序在加载期间执行,而不是在发出 run 方法之后执行
【发布时间】:2016-10-14 07:15:07
【问题描述】:

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

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

最后,如果没有别的,一旦它说“正在启动 Sapp::App”,它也应该说“Sapp::App 已启动”。和“Sapp::App 正在运行。”

为了记录,这两个选项做同样的事情:

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

【问题讨论】:

    标签: ruby sinatra rack thin


    【解决方案1】:

    好的,我明白了。我把代码放在一个类中,但不是一个方法。加载或要求都运行这样的开放代码。我需要将它包装在方法中,并执行这些方法,来做我想做的事情。

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

    【讨论】:

    • 另外,请注意,您正在继承 Sinatra::Application 而不是 Sinatra::Base,这是 modular style applications 需要使用的。您能否指出您在回答中提到的 Sinatra 示例?如果它们是官方文档的一部分,我会修复它们。
    • @Kashyap 目前正在阅读 Sinatra Up and Running 以了解所有这些。我认为这会有所帮助。该应用程序是使用 Trevi 作为模块化应用程序生成的,但我已经大量修改/玩过它,试图包含经典示例。所以,我期望这是我的经验不足。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多