为什么在Sinatra的路线之间不存在实例变量?

时间:2014-06-21 13:54:12

标签: ruby sinatra

我知道在Sinatra的路线之间保持数据的不同方法。我只是想以Ruby /面向对象的方式更多地理解这一点。

我的猜测是:无论何时搭建Sinatra应用程序,您都要实例化一个Sinatra :: Application对象。是不是每次调用get / post路由方法时,你都在创建一个新的Sinatra :: Application,因此实例变量会有所不同?

1 个答案:

答案 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>