リクエストごとに新しいsinatraオブジェクトを作成しますが、初期化は1回のみ呼び出されます
概要
次のスクリプトを使用して、非常に単純な 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 への 2 回目の呼び出しを行うと、次のように表示されます。
127.0.0.1 - - [28/Jan/2017:16:49:11 EST] "GET / HTTP/1.1" 200 31
- -> /
そして、wget の出力はこれを出力します:
object id: 9387860, class MyApp
したがって、2 回目の呼び出しでは、MyApp の別のインスタンスがありますが (object_id が最初の呼び出しと同じ値を持っていないため)、initialize は呼び出されません。新しいオブジェクトを作成し、初期化の呼び出しをバイパスするにはどうすればよいでしょうか?
解決策
新しいクラスはリクエストごとに作成されます。インスタンスは Sinatra::Application.new ではなく Sinatra::Application.prototype.dup に関連付けられているため、initialize が毎回呼び出されるわけではありません。見る ドキュメントリンク コード用。