每个请求的新sinatra对象,但初始化只调用一次

时间:2017-01-28 21:54:22

标签: ruby sinatra

我通过以下脚本创建了一个非常简单的Web服务器:

require 'sinatra'

class MyApp < Sinatra::Base

    def initialize(app = nil)
        super(app)
        puts "******** constructing myapp **********"
    end

    get '/' do
        return "object id: #{object_id}, class #{self.class}"
    end

end

MyApp.run!

如果我运行这个小型Web服务器,然后第一次调用wget -q -O - http://localhost:4567,我会在运行我的服务器的控制台中看到这个:

******** constructing myapp **********
127.0.0.1 - - [28/Jan/2017:16:47:39 EST] "GET / HTTP/1.1" 200 31
- -> /

和wget打印:

object id: 10454240, class MyApp

正如预期的那样,在第一次调用时,会创建一个MyApp对象并调用initialize

然后,如果我再次拨打wget -q -O - http://localhost:4567,我会看到:

127.0.0.1 - - [28/Jan/2017:16:49:11 EST] "GET / HTTP/1.1" 200 31
- -> /

wget的输出打印出来:

object id: 9387860, class MyApp

因此,在第二次调用时,我有一个不同的MyApp实例(因为object_id与frist调用的值不同)但是 initialize未被调用。如何创建新对象并绕过对initialize的调用?

1 个答案:

答案 0 :(得分:2)

为每个请求创建一个新类。实例不是Sinatra::Application.new但是Sinatra::Application.prototype.dup,这就是每次都不调用initialize的原因。看到 document link 代码。