我知道在Sinatra的路线之间保持数据的不同方法。我只是想以Ruby /面向对象的方式更多地理解这一点。
我的猜测是:无论何时搭建Sinatra应用程序,您都要实例化一个Sinatra :: Application对象。是不是每次调用get / post路由方法时,你都在创建一个新的Sinatra :: Application,因此实例变量会有所不同?
答案 0 :(得分:4)
你是对的。每次打开新路径时,都会重新实例化您的rack / sinatra应用程序的新实例。
您可以通过一种非常简单的方式查看:
require 'sinatra/base'
class MyApp < Sinatra::Application
get '/' do
puts self.object_id
'Hello world!'
end
end
在“localhost:9292”打开浏览器两次时得到的输出是:
Thin web server (v1.6.2 codename Doc Brown)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop
70308503790680
127.0.0.1 - - [21/Jun/2014 16:10:21] "GET / HTTP/1.1" 200 12 0.0129
70308504166760
127.0.0.1 - - [21/Jun/2014 16:10:22] "GET / HTTP/1.1" 200 12 0.0016
关注第四行和第六行:您可以看到实例具有不同的ID。
如果您只输出self
,则可以看到它是MyApp类的一个实例:
#<MyApp:0x007fbfea3a87c8>
127.0.0.1 - - [21/Jun/2014 16:19:54] "GET / HTTP/1.1" 200 12 0.0124
#<MyApp:0x007fbfea460198>