4

すべてのセッションとリクエストで変数を共有したい単純な Sinatra アプリがあります。

configure do
  @@click_count = 0
end

def send_message(text)
  # ignore, this part works
end

post '/click' do
  @@click_count = @@click_count + 1
  send_message "clicks: #{@@click_count}"
end

送信されるメッセージは常にclicks: 1インクリメントされません。私も試してみましset :click_count, 0settings.click_count = settings.click_count + 1が、それでも同じことが起こります。

shotgun web.rb -p 4567 -E production非実稼働環境で言及されている別の質問により、リクエストごとにサーバーが再起動され、状態が失われるため、ショットガンを使用してサーバーをローカルで実行しています。

これを機能させる方法はありますか?

4

2 に答える 2

5

Sinatra 自体は、開発モードではリクエストごとに再起動しませんが (以前はそうでした)、shotgunにはその効果があります。

リクエストを受信するたびに、フォークし、アプリケーションを子プロセスにロードし、リクエストを処理して、子プロセスを終了します。

を使用するだけruby web.rbで、すべてが機能するはずです (モジュロスレッドの問題は、コメントから認識しているように見えます)。

于 2012-05-31T22:42:20.607 に答える
2

configureブロックが実行される頻度はわかりません。クラス インスタンス変数の代わりにグローバル変数 (例: $click_count) を使用し、プログラムの一番上でブロックの外で初期化してみてください。

于 2012-05-31T21:36:25.127 に答える