在 Sinatra 中全局创建对象

Create object globally in Sinatra

我看过这个 question,但这仅适用于变量。我想创建一个 class 的对象并在 Sinatra

中全局使用它

我正在做类似以下的事情并且工作正常:

require 'sinatra'
require 'MyClass'

set :port, 8080
set :static, true

get '/' do
  erb :myform, :locals => {'value' => "Give a value."}
end

post '/hello/' do
  param_1 = params[:param_1]
  param_2 = params[:param_2]

  @obj = MyClass.new
  value = @obj.run(param_1, param_2)

  erb :myform, :locals => {'value' => value}
end

但我想在 post 之外创建对象。可能是这样的:

require 'sinatra'
require 'MyClass'

set :port, 8080
set :static, true

@obj = MyClass.new

get '/' do
  erb :myform, :locals => {'value' => "Give a value."}
end

post '/hello/' do
  param_1 = params[:param_1]
  param_2 = params[:param_2]

  value = @obj.run(param_1, param_2)

  erb :myform, :locals => {'value' => value}
end

但是,后者不起作用,因为我在值中得到 null。

如何创建一次对象然后全局使用它?

如果你想要一个全局可访问的变量,只需使用 $ 符号:

$myobj = MyObject.new
... more code
$myobj.some_method

然而,一个稍微更优雅的解决方案可能是这样的:

require 'sinatra/base'

class MyApp < Sinatra::Base
  set :sessions, true
  set :my_obj, MyObject.new

  get '/' do
    # call settings.my_obj
  end
end