Techioz Blog

リクエストごとに新しい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 が毎回呼び出されるわけではありません。見る ドキュメントリンク コード用。